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 을 왜 사용하면 안되나요?
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 ;