mysql 질문이 있습니다. 0 7 441

by 리카온 [SQL Query] [2022.01.06 10:23:25]


안녕하세요 혹시 이게 가능한지

문의 드립니다.

테이블 생산테이블이 있습니다.

데이타는 이런식으로 들어가있고 같은날짜에 사이트와 생산일자는 같고 품목이 다른데

품목의 각각의 총량과 생산량 폐기량이 들어가 있습니다.

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 지우개 지우개의 토탈 지우개의    노트 노트의 토탈 지우개의생산 지우개의폐기
   
   
   
   
   
   
   
   

 

by 마농 [2022.01.06 11:46:29]
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
;

 


by 리카온 [2022.01.06 11:52:08]

감사드립니다.새해 복많이 받으세요 마농님


by 리카온 [2022.01.06 12:12:28]

아 마농님 이거 오라클쿼리 아닌가요?

그리고 가변이라고 가정하면 품목이 14개가 된다면 불가능하겠군요.계속 만들어줘야 하니.

 


by 마농 [2022.01.06 12:36:25]

MySQL 입니다. (8.0 이상)
품목이 14개 고정이라면 고정 스타일로 가시면 되고
가변이라면 최대 가능한 개수 감안하여 추가하시면 됩니다.


by 리카온 [2022.01.06 13:04:25]

아 네 전 버전이 낮아서 그런지 오류가 나네요

SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '     , MIN(CASE item WHEN '지우개' THEN cre END) cre_지우개

    ' at line 11

감사합니다.

 


by 마농 [2022.01.06 15:25:51]
-- 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
;

by 리카온 [2022.01.06 16:22:42]

네 감사합니다.좋은하루 되세요

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