안녕하세요...답변글을 보고 머리를 싸매고 해봤지만..안되네요 ㅠㅠ
(1)정리.txt (소스파일) 입니다.
(2) Join할 테이블 들입니다.
Select * From MS_GOODS_CLASS --분류테이블
Select * From MS_SALBAR --상품테이블
Select * From SL_SALE_D --매출디테일테이블
Select * From SL_SALE_H --매출헤더테이블
Select * From MS_TRD --거래처테이블
현재 조회하면 그림(참고그림)처럼 결과물이 나옵니다.
1월 2월 3월
1 2 3
1 2 3
1 2 3 순으로 나와야 원하는 그림이 나오는데...
1월 2월 3월
1 null null
1 null null
1 null null
null 2 null
null 2 null
null 2 null
null null 3
null null 3
null null 3 이렇게 이어서 조회됩니다..ㅠ0ㅠ
Case When C.ymd_sale Between '20100101' and '20100131' Then '1월' Else 이부분에 나머지값은 제외 End As [2010년 1월],
또는 Where절에 조건식만 넣을수 있으면 될꺼 같은데 그걸 모르겠습니다..ㅠ0ㅠ
또 1월을 case문에서 1월로 표시가 되어 있는데 각각의 데이터가 2010~원래날짜로 표시할 방도가 없을까요?...
inner Join까지 참 편하게 하다가...이제는 머리가 터질지경이네요..ㅠㅠ
Comment 14
-
건우아빠
2013.07.18 09:46
-
MissingYou
2013.07.18 17:23
sum을 추가하니 sum 연산자에 대한 피연산자 데이터 형식 varchar이(가) 잘못되었습니다.라고 나오네요;
검색해보니 http://www.sqler.com/189378 이렇게 하면 case에 걸리네요...어떻게 convert를 해야할지 ㅠㅠ
-
건우아빠
2013.07.18 17:30
max로 하셔도 됩니다.
데이타내역을 보시면 그룹별 월 부분이 하나씩만 나옵니다. 만약 여러건이 합해서나오게 된다면 형변환을 하시고 sum 으로 하셔야 할듯 합니다.
-
MissingYou
2013.07.18 19:51
group by를 각각의 내역을 합해주시면 됩니다.
라고 하셨는데 Case문으로 생선된 [2010년 1월]을 어떻게 합칠까요?ㅠㅠ
이게 매년해가 바뀌어서
Case When ymd_sale Between '20100101' and '20100131' Then '1월' Else '' End As [2010년 1월] 을
Case When SubString(C.ymd_sale, 5, 2) = '01' Then sum(C.qty_sale) End As [1월], 로 수정했습니다.
즉 Case문앞에 Sum을 못쓰더군요ㅠㅠ
합계는
Case When SubString(C.ymd_sale, 5, 2) = '01' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '02' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '03' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '04' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '05' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '06' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '07' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '08' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '09' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '10' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '11' Then sum(C.qty_sale)
When SubString(C.ymd_sale, 5, 2) = '12' Then sum(C.qty_sale) End As [합계] 로 묶어버렸는데..결과값이 나오긴하는데이게 최선일려나.. 어떻게해서든 case문으로 생성한 1월 / 2월 / 3월...의 내역을 합치기만 하면 될꺼같습니다 ㅠ
-
건우아빠
2013.07.19 09:12
합계는 그냥 sum(C.qty_sale) 만 하시면 되지 않을까요...
case를 쓰실 필요는.....
-
MissingYou
2013.07.19 09:42
지금 1월에는 1월만 표시가 되야하는데,
1월에 매출수량 그밑에 2월, 3월...12월(NULL로) 다나오고
2월에는 1월(NULL로) 매출수량그대로 2월에 매출수량 그리고 3월 4월....12월(NULL로) 나오는 순인데요.
원하는것은 1월에는 1월 매출데이터만 / 2월에는 2월매출데이터만 나오는것입니다.
이걸 묶을 방법이 없을까요?...저는 그래서 sum이 그거인줄 알았네요..ㅎㅎ;;
정확한 결론은 case로 묶은 1월/2월/3월...12월을 그 해당월의 매출만 조회되게 하는것입니다.ㅠㅠ
-
건우아빠
2013.07.19 10:59
MissingYou 님이 작성한 쿼리를 보면group by 에 , C.qty_sale ,C.ymd_sale 를 잡으셨습니다.. 이게 자료를 잘못 나오게 하는 원인 입니다. 수량별, 일자별로 group을 하는거라 월별로는 절대 합해지지가 않습니다. sum은 case문을 포함해서 잡아주시면 됩니다.Select E.nm_trdpl As '업체명'
, A.nm_class As '분류명'
, B.nm_barcode As '장비명'
, sum(Case When SubString(C.ymd_sale, 5, 2) = '01' Then (C.qty_sale) End) As [1월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '02' Then (C.qty_sale) End) As [2월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '03' Then (C.qty_sale) End) As [3월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '04' Then (C.qty_sale) End) As [4월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '05' Then (C.qty_sale) End) As [5월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '06' Then (C.qty_sale) End) As [6월]
, sum(Case When SubString(C.ymd_sale, 5, 2) between '01' and '06' Then (C.qty_sale) End) As [상반기]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '07' Then (C.qty_sale) End) As [7월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '08' Then (C.qty_sale) End) As [8월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '09' Then (C.qty_sale) End) As [9월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '10' Then (C.qty_sale) End) As [10월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '11' Then (C.qty_sale) End) As [11월]
, sum(Case When SubString(C.ymd_sale, 5, 2) = '12' Then (C.qty_sale) End) As [12월]
, sum(Case When SubString(C.ymd_sale, 5, 2) between '07' and '12' Then (C.qty_sale) End) As [하반기]
, sum(C.qty_sale) As [합계]
From MS_GOODS_CLASS as A inner join MS_SALBAR as B
on A.cd_store = B.cd_store
and A.cd_class = B.cd_class
inner join SL_SALE_D as C
on B.cd_store = C.cd_store
and B.barcd_s = C.barcd_s
inner join SL_SALE_H as D
on C.cd_store = D.cd_store
and C.ymd_sale = D.ymd_sale
and C.no_pos = D.no_pos
and C.no_rcp = D.no_rcp
inner join MS_TRD as E
on D.cd_store = E.cd_store
and D.cd_trdpl = E.cd_trdpl
Group By E.nm_trdpl, A.nm_class, B.nm_barcode
order By E.nm_trdpl, A.nm_class, B.nm_barcode
-
MissingYou
2013.07.19 14:12
아 그렇군요!! 감사합니다.
하지만..Group By에서 C.ymd_sale을 빼니
열 'SL_SALE_D.ymd_sale'이(가) 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다.라고 나오네요;;산넘어 산이네요..ㅠㅠ
-
건우아빠
2013.07.19 15:56
sum(case ......) 이렇게 하셨는지
case ..then sum() 이렇게 하셨는지....
참고로 join을 해서 명칭을 가져오실 때는
코드로 집계를 만드시고 만들어진 결과를 가지고 조인을 하셔서 표현하시는게 성능이 좀 좋을듯 합니다.
-
MissingYou
2013.07.19 17:00
sum(case ......) 형식으로 했습니다!!
참고로 join을 해서 명칭을 가져오실 때는
코드로 집계를 만드시고 만들어진 결과를 가지고 조인을 하셔서 표현하시는게 성능이 좀 좋을듯 합니다.
<-- 서브쿼리??인가요? 어렵군요...아직도 해결불가능하네요;
http://blog.naver.com/gn0908?Redirect=Log&logNo=110046008054
또한 group by를 안쓰려는 경우는 집계함수가 하나도 없던지,
모든 컬럼들이 전부 집계함수로 들어가 있어야 합니다...참고하세요. <- 라는데 도통 해결이 안되네요;;
어려운 SQL ㅠㅠ
-
MissingYou
2013.07.19 18:45
아 해결했습니다!!
Sum(Case When SubString(C.ymd_sale, 5, 2) between '07' and '12' Then (C.qty_sale) End) As [하반기], (C.qty_sale) As [합계]
이부분에 C.qty_sale이 들어가서 그랬네요 ㅠㅠ
정말로 감사합니다! 지금조회 잘됩니다 ㅎㅎ
고생하셨습니다 ㅠㅠ
-
건우아빠
2013.07.19 19:35
헐,,, 제 실수입니다..
-
항해자™
2013.07.18 10:05
, sum(Case When C.ymd_sale Between '20100101' and '20100131' Then '1월' Else '' End) As [2010년 1월]
보다는SUM(LEFT(C.ymd_sale,6)) AS ym_sale -
MissingYou
2013.07.18 17:24
답변감사합니다!~~
다하셨네요...
Select E.nm_trdpl, A.nm_class, B.nm_barcode, C.qty_sale, C.ymd_sale,
, sum(Case When C.ymd_sale Between '20100101' and '20100131' Then '1월' Else '' End) As [2010년 1월]
......
group by E.nm_trdpl, A.nm_class, B.nm_barcode, C.qty_sale, C.ymd_sale
group by를 각각의 내역을 합해주시면 됩니다.