안녕하세요 초보 SQLER입니다. :)
A table
----------
no name
1 aaaa
2 bbbb
B table
----------
no date data
1 2014-06-17 300
1 2014-06-17 200
2 2014-06-17 100
이렇게 데이터 테이블이 존재하구요
select a.no , a.name, ifnull(sum(b.data),0)
from a left join b on a.no=b.no
where b.date='06-17'
group by b.no
order by b.no
이렇게 쿼리를 작성했는데요
결과는
no name data
1 aaaa 500
2 bbbb 100
이렇게 나옵니다.
제가 질문드리고 싶은거는 6-18일로 조회하면
조회 결과가 없다고 나오는데요
no name data
1 aaaa 0
2 bbbb 0
이렇게 나오길 원하는데요. 레프트조인을 하면 왼쪽테이블 기준으로 나온다고 하는데
오른쪽 테이블에서 그룹지어서 합계를 내서 그런가 결과 값이 안나오는데요.
조언 주시면 감사하겠습니다.
Comment 12
-
catchv
2014.06.17 13:32
-
견우얌
2014.06.17 13:58
넵 예제 코드로 적다보니 데이터부분하고 오타가 좀 있었습니다. ^^;;그부분은 오타 없이 실제로는 적용한 상태이긴 해요
감사합니다~(__)*
-
Hisory
2014.06.17 13:38
select a.no , a.name, ifnull(sum(b.data),0)
from a left join b on a.no=b.no
where b.date='06-17'
group by b.no
order by b.no===>
select a.no , a.name, ifnull(sum(b.data),0)
from a left join b on a.no=b.no
where b.date='2014-06-17'
group by a.no , a.nameorder by a.no
-
견우얌
2014.06.17 13:53
넵 예제 코드로 적다보니 데이터부분하고 오타가 좀 있었습니다. ^^;;
그부분은 오타 없이 실제로는 적용한 상태이긴 해요
감사합니다~(__)
-
날짜별로 그루핑 할때 없는 날짜도 나오도록 하는 질문은 항상 나오는데요.
데이타 자체에 날짜가 없을경우 일반적인 쿼리로는 힘듭니다.
제가 사용하는 방법은
1900-01-01부터 2040-12-31까지 들어있는 날짜 테이블을 하나 만들고
그 테이블과 OUTER JOIN을 하는 것입니다.
약 52000건 정도 들어가고 10메가 남짓 사용합니다.
2040년 이후엔 젊은 놈들이 알아서 해결할테고.. ㅎㅎ
-
견우얌
2014.06.17 13:52
서브쿼리를 사용하거나 unioin으로 테이블을 병합시켜서 하는 방법으로 해결 가능할까요?자제하고 싶은 구문들이긴합니다만 방법이라면 써야죠 ㅎㅎ ^^::::
-
B테이블에 데이타가 없으면 힘들죠.
만약 테이블 없이 굳이 하겠다면
입력한 날짜만큼 임시테이블이나 테이블 변수에 WHILE나 커서 돌려서 데이터를 넣은 후에 그 테이블과 OUTER JOIN을 해야죠.
다른 방법이 없진 한겠지만... 제 머리로 생각 안나는거 보니 꽤나 복잡할거 같습니다. (음... 의외로 안복잡할 수도 있겠네요-_-;;)
날짜 테이블 하나 만들어 두면 두고 두고 쓸때가 참 많습니다.
저희는 날짜 테이블에 날짜, 공휴일여부, 말일인지 여부, 음력, 엑셀의 날짜에 해당하는 int값 등등 넣어두고 쓰는데 참 좋네요.
-
견우얌
2014.06.17 14:39
워낙 단순하게 두개의 테이블에서 값을 조회 해오는 거라 서브쿼리 무식하게 처리 했습니다.
나중에 초짜해커님 방법대로 날짜에대한 처리할때는 따로 테이블을 두어서 처리해야겠습니다.
감사합니다~
-
견우얌
2014.06.17 14:37
제 의도는 A테이블의 no, name은 유지하고 그에 해당하는 데이터가 1개이상이면 합계 처리 0개면 0 처리 하는것이었습니다.
서브쿼리로 무식하게나마 처리 하였습니다. :) 날씨가 더운관계로 대충대충 ;;;
select no, name, ifnull
(
(
select sum(data)
from b
where date='2014-06-17' and a.no = b.no
group by no
)
,0)
from a
-
그런 의도라면 Join절에 날짜를 넣어도 됩니다.
-
견우얌
2014.06.17 14:41
제가 잘못 넣는건지 조인절에 날짜를 삽입하면
없는날짜에는 결과 값이 없어요 ;;
-
저도 질문을 잘못 이해하고 있었네요.
BETWEEN 조건만 아니면 날짜 표현도 가능해보입니다.
DECLARE @A TABLE (NO INT, NAME VARCHAR(10))
DECLARE @B TABLE (NO INT, DATE DATETIME, DATA INT)
INSERT @A SELECT 1, 'aaaa'
INSERT @A SELECT 2, 'bbbb'
INSERT @B SELECT 1, '2014-06-17', 300
INSERT @B SELECT 1, '2014-06-17', 200
INSERT @B SELECT 2, '2014-06-17', 100
DECLARE @DATE DATETIME
SET @DATE = '2014-06-18'
SELECT DATE = @DATE, A.NO, NAME = MIN(A.NAME), DATA = ISNULL(SUM(B.DATA), 0)
FROM @A A LEFT OUTER JOIN
@B B ON A.NO = B.NO AND B.DATE = @DATE
GROUP BY A.NO
select a.no , a.name, ifnull(sum(b.data),0)
from a left join b on a.no=b.no AND b.date='06-18'
group by b.no
order by b.no
그런데 쿼리가 좀 이상하네요.