가로로 데이터 출력문제 0 6 755

by 프레드윰 [SQL Query] [2021.02.04 15:59:19]


안녕하세요! 가입 한지 오래됐는데 첫 질문을 남깁니다.

지금 디비 테이블 주어진 테이블은 이건데요.

pt_no wid mb_id pt_type pt_code pt_name pt_price pt_date
1 1 demo1 1 20210202533839 기본급 3000000 2021-01-10
2 1 demo1 1 20210203289904 수당 1000000 2021-01-10

여기서 쭈루룩 세로로 데이터가 출력됩니다.

 

html 테이블 에서 디비 레코드를 뽑아서 밑에 처럼 만들고싶어요.

날짜 형태 기본급 수당1 수당2 수당3 수당4 수당5 수당6 수당7 수당8 합계
2021-01-10 1 3000000 100000 100000 ... ... ... ... ... .... 합계
2021-02-10 1 3000000 100000 100000 ... ... ... ... ... ... 합계

 

여기서 기본급부터 수당1 ~ 수당8까지 가로로 표시하고픈데 아무리 생각해도 어렸습니다..

어떻게 해야할까요 읽어주셔서 감사합니다.

by 샤랄라 [2021.02.04 16:58:24]
with t(pt_no, wid, mb_id, pt_type , pt_code, pt_name, pt_price, pt_date) as 
(select 1, 1, 'demo1', 1, '20210202533839', '기본급', 3000000, '2021-01-10' from dual union all
 select 2, 1, 'demo1', 1, '20210203289904', '수당1' , 1000000, '2021-01-10' from dual union all
 select 3, 1, 'demo1', 1, '20210203289904', '수당2' , 1000000, '2021-01-10' from dual union all
 select 4, 1, 'demo2', 1, '20210202533839', '기본급', 4000000, '2021-01-10' from dual union all
 select 5, 1, 'demo2', 1, '20210203289904', '수당1' , 2000000, '2021-01-10' from dual 
)
select pt_date, mb_id, pt_type
     , nvl(max(A), 0) as "기본급"
     , nvl(max(B), 0) as "수당1"
     , nvl(max(C), 0) as "수당2"
     , nvl(max(D), 0) as "수당3"
     , nvl(max(E), 0) as "수당4"
     , nvl(max(F), 0) as "수당5"
     , nvl(max(G), 0) as "수당6"
     , nvl(max(H), 0) as "수당7"
     , nvl(max(I), 0) as "수당8"
     , nvl(max(tot_price), 0) as "합계"
from (select pt_no, wid, mb_id, pt_type , pt_code, pt_name, pt_price, pt_date
           , sum(pt_price) over(partition by mb_id) tot_price
      from t)
pivot(max(pt_price) for pt_name in ('기본급' as A
                                  , '수당1' as B, '수당2' as C , '수당3' as D, '수당4' as E
                                  , '수당5' as F, '수당6' as G , '수당7' as H, '수당8' as I))
group by pt_date, mb_id, pt_type                                  
;

 


by 프레드윰 [2021.02.04 17:33:33]

죄송한데 mysql 5.7 버전인데 함수 안먹힌게 있네요 ㅠㅠㅠ


by 마농 [2021.02.04 17:16:21]

집계 기준이나 항목 기준이 뭔지 제시되어 있지 않네요?
1. 집계(그룹핑) 기준은 뭔가요?
- GROUP BY wid, mb_id, pt_date, pt_type ?
2. 항목을 나누는 기준이 뭔가요?
- pt_no 에 따라 나뉘나요?
- pt_code 에 따라 나뉘나요?
- pt_name 에 따라 나뉘나요?
 

SELECT wid
     , mb_id
     , pt_date
     , pt_type
     , SUM(DECODE(pt_code, '20210202533839', pt_price)) 기본급
     , SUM(DECODE(pt_code, '20210203289904', pt_price)) 수당1
     , SUM(DECODE(pt_code, '22222222222222', pt_price)) 수당2
     , SUM(DECODE(pt_code, '33333333333333', pt_price)) 수당3
     , SUM(DECODE(pt_code, '44444444444444', pt_price)) 수당4
     , SUM(DECODE(pt_code, '55555555555555', pt_price)) 수당5
     , SUM(DECODE(pt_code, '66666666666666', pt_price)) 수당6
     , SUM(DECODE(pt_code, '77777777777777', pt_price)) 수당7
     , SUM(DECODE(pt_code, '88888888888888', pt_price)) 수당8
     , SUM(pt_price) 합계
  FROM t
 GROUP BY wid, mb_id, pt_date, pt_type
;

 


by 프레드윰 [2021.02.04 17:27:10]

아.. 날짜 기준으로 해야되요 

월별로 출력하는건데.. 실수로 얘기 못했네요

근데 decode 함수는 오라클에서만 있다고들었는데 해보니까 안되네요 mysql 5.7 쓰고 있어요

 


by 마농 [2021.02.04 17:42:53]
SELECT wid
     , mb_id
     , pt_date
     , pt_type
     , SUM(CASE pt_code WHEN '20210202533839' THEN pt_price END) 기본급
     , SUM(CASE pt_code WHEN '20210203289904' THEN pt_price END) 수당1
     , SUM(CASE pt_code WHEN '22222222222222' THEN pt_price END) 수당2
     , SUM(CASE pt_code WHEN '33333333333333' THEN pt_price END) 수당3
     , SUM(CASE pt_code WHEN '44444444444444' THEN pt_price END) 수당4
     , SUM(CASE pt_code WHEN '55555555555555' THEN pt_price END) 수당5
     , SUM(CASE pt_code WHEN '66666666666666' THEN pt_price END) 수당6
     , SUM(CASE pt_code WHEN '77777777777777' THEN pt_price END) 수당7
     , SUM(CASE pt_code WHEN '88888888888888' THEN pt_price END) 수당8
     , SUM(pt_price) 합계
  FROM t
 GROUP BY wid, mb_id, pt_date, pt_type
;

 


by 프레드윰 [2021.02.04 18:28:56]

감사합니다. 응용했더니 아주 잘 되네요 case then 이걸로 좀 쿼리 짜고 있다가.. 잘 안되서 포기했는데 마농님 덕분이 한방에 해결 했어요

ㅠㅠ 너무 너무 감사합니다.

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