세로 data를 가로로 하는.... 0 2 755

by 느림보 [SQL Query] [2019.05.27 13:19:22]


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 입니다.  

by 마농 [2019.05.27 14:13:06]

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
;

 


by 느림보 [2019.05.27 18:05:26]

감사합니다.  완전 해결 되었습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입