안녕하세요..
맨날 눈팅만 하는 초보 개발자 입니다.
고수님들께 질문 하나 여쭤볼려구요~~ㅎ
검색을 해서 찾아 보고 어찌어찌 해볼려구 하는데 잘 안되서 질문 올립니다.(양해 부탁드립니다..)
세로 데이터를 가로 데이터로 만들려구 하는데 잘안되서요.. ;;;;
제품테이블
IDX |
CODE |
NAME |
1 |
AA |
TV |
2 |
BB |
오디오 |
3 |
CC |
냉장고 |
4 |
DD |
비디오 |
5 |
EE |
카메라 |
…..
판매테이블
IDX |
DATE |
SALE |
1 |
20160301 |
6 |
2 |
20160301 |
5 |
3 |
20160301 |
16 |
4 |
20160301 |
10 |
5 |
20160301 |
8 |
2 |
20160302 |
100 |
3 |
20160302 |
60 |
5 |
20160302 |
1 |
결과1
DATE |
TV |
오디오 |
냉장고 |
비디오 |
카메라 |
20160301 |
6 |
5 |
16 |
10 |
8 |
20160302 |
0 |
100 |
60 |
1 |
0 |
20160303 |
0 |
0 |
0 |
0 |
0 |
결과2
NAME |
20160301 |
20160302 |
20160303 |
TV |
6 |
0 |
0 |
오디오 |
5 |
100 |
0 |
냉장고 |
16 |
60 |
0 |
비디오 |
10 |
1 |
0 |
카메라 |
8 |
0 |
0 |
위 처럼 두 가지 경우의 결과가 나올려면 어떸케 해야는지요.. ㅠ
날짜는 기간으로 검색하구요...
제품테이블은 제품 데이터가 많아서 CASE 문으로 쓰기에는 부담이 있어서요..
고수님들의 많은 가름침 꼭~ 부탁드리겠습니다.
감사합니다.
Comment 6
-
ilovejsp
2016.04.12 09:33
-
ilovejsp
2016.04.12 09:37
2번은
SELECT name,isnull([20160301],0) as '20160301',isnull([20160302],0) as '20160302',isnull([20160303],0) as '20160303'
FROM
(
SELECT sale.date,sale.sale,product.name
FROM sale,product
where product.idx=sale.idx and date between '20160301' and '20160303'
)AS A
PIVOT
(
SUM(A.sale)
FOR A.date IN ([20160301],[20160302],[20160303])) AS B
ORDER BY name desc -
사이비
2016.04.12 10:44
감사합니다. 아직 이해는 안가지만 한번해보도록하겠습니다. -
사이비
2016.04.12 10:47
그런데 혹시요~
1번에서 TV,냉장고... 제품이 많은데요
명시적으로 하지 않는 방법은 없을까여?
제품이 너무 많아서요... ;;;; -
ilovejsp
2016.04.12 11:22
DECLARE @cols NVARCHAR(2000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t2.name
FROM product AS t2
ORDER BY '],[' + t2.name
FOR XML PATH('')
), 1, 2, '') + ']'
select @colsDECLARE @query NVARCHAR(4000)
SET @query = N'SELECT date,'+@cols+'
FROM
(
SELECT sale.date,sale.sale,product.name
FROM sale,product
where product.idx=sale.idx and date between ''20160301'' and ''20160303''
)AS A
PIVOT
(
SUM(A.sale)
FOR A.name IN
( '+@cols +')
) AS B'
EXECUTE(@query)
이렇게 조회하면 결과값이 나옵니다. 테이블명하고 컬럼명은 맞추시면되고요.
DECLARE @cols NVARCHAR(2000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t2.name
FROM product AS t2
ORDER BY '],[' + t2.name
FOR XML PATH('')
), 1, 2, '') + ']'
select @cols위의 조회는 전체 제품을 갖고와 @col이라는 임시변수에 넣는것입니당
끝! 근데 문제는 저렇게 dynamic 쿼리로 갖고오면 null값을 처리못해줘요, mssql에서는 isnull(*,0)이와 같은게 먹히지 않기 때문에
일일이 null값을 처리해주는수밖에는
-
사이비
2016.04.14 13:36
다시 한번 진심으로 감사드립니다~
피벗을 사용해서 풀어야 합니다.
1번먼저답변드릴게요
SELECT date,isnull([TV],0) as 'TV',isnull([오디오],0) as '오디오',isnull([냉장고],0) as '냉장고',isnull([비디오],0) as '비디오',isnull([카메라],0) '카메라'
FROM
(
SELECT sale.date,sale.sale,product.name
FROM sale,product
where product.idx=sale.idx and date between '20160301' and '20160303'
)AS A
PIVOT
(
SUM(A.sale)
FOR A.name IN ([TV],[오디오],[냉장고],[비디오],[카메라])
) AS B