seno | dept | item | price | qty | domamt |
1 | s1 | 상의 | 100 | 150 | 15000 |
2 | s1 | 상의 | 100 | 50 | 5000 |
3 | s2 | 상의 | 90 | 20 | 1800 |
3 | s2 | 하의 | 75 | 150 | 11250 |
3 | s2 | 하의2 | 85 | 70 | 5950 |
위의 data를 기준으로
dept | 상의 | 하의 | 하의2 |
s1 price | 100 | ||
s1 qty | 200 | ||
s1 domamt | 20000 | ||
s2 price | 90 | 75 | 85 |
s2 qty | 20 | 150 | 70 |
s2 domamt | 1800 | 11250 |
5950 |
이렇게 data가 나올수 있을까요?? pivot 사용하지 않고,, mssql 입니다.
PIVOT 을 왜 사용하면 안되나요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | WITH t(seno, dept, item, price, qty, domamt) AS ( SELECT 1, 's1' , '상의' , 100, 150, 15000 UNION ALL SELECT 2, 's1' , '상의' , 100, 50, 5000 UNION ALL SELECT 3, 's2' , '상의' , 90, 20, 1800 UNION ALL SELECT 3, 's2' , '하의' , 75, 150, 11250 UNION ALL SELECT 3, 's2' , '하의2' , 85, 70, 5950 ) -- 1. PIVOT / UNPIVOT SELECT * FROM ( SELECT dept, item, price, qty, domamt FROM t) a UNPIVOT (v FOR gb IN (price, qty, domamt)) a PIVOT ( SUM (v) FOR item IN (상의, 하의, 하의2)) a ORDER BY dept, CHARINDEX(gb, 'price, qty, domamt' ) ; -- 2. 복제용 테이블과 Cross Join 후 Group By, Sum(Case) -- SELECT dept , gb , SUM ( CASE item WHEN '상의' THEN v END ) 상의 , SUM ( CASE item WHEN '하의' THEN v END ) 하의 , SUM ( CASE item WHEN '하의2' THEN v END ) 하의2 FROM ( SELECT dept , item , lv , gb , CASE lv WHEN 1 THEN price WHEN 2 THEN qty WHEN 3 THEN domamt END v FROM t a CROSS JOIN ( SELECT 1 lv, 'price' gb UNION ALL SELECT 2, 'qty' UNION ALL SELECT 3, 'domamt' ) copy_t ) a GROUP BY dept, lv, gb ORDER BY dept, lv ; |