안녕하세요 혹시 이게 가능한지
문의 드립니다.
테이블 생산테이블이 있습니다.
데이타는 이런식으로 들어가있고 같은날짜에 사이트와 생산일자는 같고 품목이 다른데
품목의 각각의 총량과 생산량 폐기량이 들어가 있습니다.
site | create_date | item | total | create | delete |
일산 | 2021-12-01 | 지우개 | 3 | 1 | 1 |
일산 | 2021-12-01 | 노트 | 2 | 2 | 2 |
일산 | 2021-12-02 | 지우개 | 3 | 3 | 1 |
서울 | 2021-12-01 | 지우개 | 3 | 2 | 1 |
같은 table에 데이타를 아래와 같이 한row에 나오게 하는게 가능한가요?
site | create_date | item | total | create | delete | item | total | create | delete |
일산 | 2021-12-01 | 지우개 | 지우개의 토탈 | 지우개의 | 노트 | 노트의 토탈 | 지우개의생산 | 지우개의폐기 | |
WITH t AS ( SELECT '일산' site, '2021-12-01' create_date, '지우개' item, 3 tot, 1 cre, 1 del UNION ALL SELECT '일산', '2021-12-01', '노트' , 2, 2, 2 UNION ALL SELECT '일산', '2021-12-02', '지우개', 3, 3, 1 UNION ALL SELECT '서울', '2021-12-01', '지우개', 3, 2, 1 ) -- 품목이 고정으로 정해진 경우 -- SELECT site , create_date , MIN(CASE item WHEN '지우개' THEN tot END) tot_지우개 , MIN(CASE item WHEN '지우개' THEN cre END) cre_지우개 , MIN(CASE item WHEN '지우개' THEN del END) del_지우개 , MIN(CASE item WHEN '노트' THEN tot END) tot_노트 , MIN(CASE item WHEN '노트' THEN cre END) cre_노트 , MIN(CASE item WHEN '노트' THEN del END) del_노트 FROM t GROUP BY site, create_date ;
WITH t AS ( SELECT '일산' site, '2021-12-01' create_date, '지우개' item, 3 tot, 1 cre, 1 del UNION ALL SELECT '일산', '2021-12-01', '노트' , 2, 2, 2 UNION ALL SELECT '일산', '2021-12-02', '지우개', 3, 3, 1 UNION ALL SELECT '서울', '2021-12-01', '지우개', 3, 2, 1 ) -- 품목이 가변인 경우 -- SELECT site , create_date , MIN(CASE rn WHEN 1 THEN item END) item_1 , MIN(CASE rn WHEN 1 THEN tot END) tot_1 , MIN(CASE rn WHEN 1 THEN cre END) cre_1 , MIN(CASE rn WHEN 1 THEN del END) del_1 , MIN(CASE rn WHEN 2 THEN item END) itm_2 , MIN(CASE rn WHEN 2 THEN tot END) tot_2 , MIN(CASE rn WHEN 2 THEN cre END) cre_2 , MIN(CASE rn WHEN 2 THEN del END) del_2 , MIN(CASE rn WHEN 3 THEN item END) item_3 , MIN(CASE rn WHEN 3 THEN tot END) tot_3 , MIN(CASE rn WHEN 3 THEN cre END) cre_3 , MIN(CASE rn WHEN 3 THEN del END) del_3 FROM (SELECT site, create_date, item, tot, cre, del , ROW_NUMBER() OVER(PARTITION BY site, create_date ORDER BY item) rn FROM t ) a GROUP BY site, create_date ;
-- WITH 문 및 Row_number 등은 8.0 이상에서만 동작하구요. -- WITH 문은 테스트 용도로 넣은 것이니 무시하시면 되고 -- 혹시 Case 문이 안된다면? IF 문 써보세요. SELECT site , create_date , MAX(IF(item = '지우개', tot, 0)) tot_지우개 , MAX(IF(item = '지우개', cre, 0)) cre_지우개 , MAX(IF(item = '지우개', del, 0)) del_지우개 , MAX(IF(item = '노트' , tot, 0)) tot_노트 , MAX(IF(item = '노트' , cre, 0)) cre_노트 , MAX(IF(item = '노트' , del, 0)) del_노트 FROM t GROUP BY site, create_date ;