특정컬럼의 값 종류에 따라 컬럼 동적으로 생성 0 3 2,208

by 나나나나 [MySQL] [2017.09.06 02:05:02]


안녕하세요
item기준, store의 종류에 따라 컬럼을 동적으로 뽑고 싶은데 방법을 모르겠습니다(날짜별 sum).
디비는 mysql입니다.

 

id item store amount date
1 사과 A 슈퍼 5000 20170901
2 딸기 O 백화점 3000 20170901
3 수박 P 슈퍼 8000 20170901
4 수박 P 슈퍼 6000 20170901
5 딸기 O 백화점 2000 20170901
6 사과 O 백화점 7000 20170901
7 사과 J 백화점 9000 20170901
8 사과 J 백화점 330000 20170901
9 딸기 A 슈퍼 66000 20170901
10 수박 P 슈퍼 13000 20170902
11 수박 P 슈퍼 43000 20170902
12 딸기 J 백화점 78000 20170902
13 사과 O 백화점 43000 20170902
14 사과 O 백화점 39000 20170902
15 딸기 A 슈퍼 20000 20170902
16 수박 P 슈퍼 50000 20170902

 

결과값

1. item, 날짜별 sum

    A 슈퍼 O 백화점 J 백화점
사과 20170901 5000 7000 339000
사과 20170902 0 82000 0

 

    A 슈퍼 O 백화점 J 백화점
딸기 20170901 66000 5000 0
딸기 20170902 20000 0 78000

 

    P 슈퍼
수박 20170901 14000
수박 20170902 106000

 

2. total, 날짜별 sum

    A 슈퍼 O 백화점 J 백화점 P 슈퍼
사과 20170901 5000 7000 339000 0
사과 20170902 0 82000 0 0
딸기 20170901 66000 5000 0 0
딸기 20170902 20000 0 78000 0
수박 20170901 0 0 0 14000
수박 20170902 0 0 0 106000

 

 

감사합니다

by 마농 [2017.09.06 08:19:58]

SQL 만으로 가변 컬럼 구현은 안됩니다.
프로그래밍으로 동적 쿼리를 구성해야 합니다.
 

-- 1. 동적쿼리
SELECT item
     , date
     -- 여기부터 --
     , SUM(CASE store WHEN 'A 슈퍼'   THEN amount ELSE 0 END) "A 슈퍼"
     , SUM(CASE store WHEN 'O 백화점' THEN amount ELSE 0 END) "O 백화점"
     , SUM(CASE store WHEN 'J 백화점' THEN amount ELSE 0 END) "J 백화점"
     -- 여기까지 --
  FROM t
 WHERE date BETWEEN '20170901' AND '20170930'
   AND item = '사과'
;

-- 2. 동적쿼리를 만들기 위한 선행 쿼리
SELECT DISTINCT store
  FROM t
 WHERE date BETWEEN '20170901' AND '20170930'
   AND item = '사과'
;

 


by 우리집아찌 [2017.09.06 08:34:17]

자주 나오는 질문이에요..

마농님 쿼리와 ref_cursor 이용하면 프로시져로 구현해서 원하는 값을 가져오실수있습니다. 

http://www.gurubee.net/lecture/1843


by 우리집아찌 [2017.09.06 09:08:27]

mybatis에서 pivot을 좀 이용하면 가능할수도 있겠네요.

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