Postgresql 피벗 문의 드립니다. 0 2 1,524

by l폭주천사l [SQL Query] 이제 짤릴거 같아요 도와주세요 [2022.04.20 19:42:37]


tobe.png (52,819Bytes)

안녕하세요, SQL문 구글링 하다가 문의 하게 되었습니다. 

SQL문에 약하다 보니 주위 사람들에게도 물어보고, 

구글링 하다보니 답은 안나오고 시간은 다가 오고 있어 다급한 마음에 문의 드려 봅니다. 

엑셀로 문의 드리는점 양해 부탁 드립니다. 

PROD_CODE가 속한  TARGET_ID별 PROD_INDEX_AVG의 평균 값과, PROD_CNT 합계를 구해야 하는 쿼리문 입니다.  

최초 raw데이터에서 원본까지 추출하는 쿼리까지는 어찌어찌 만들었는데.. 피봇 쿼리는 정말 이해가 안가네요..ㅠㅠ

DB는 Potgresql이고 extention사용은 불가능하여 crostab은 설치가 불가한 환경합니다. 

쿼리 능력자분들의 도움 부탁 드립니다.  

 

1. 원본

ID TARGET_ID TEAM_CODE PROD_CODE PROD_NAME TARGET_SAME TARGET_LOW TARGET_HIGH PROD_INDEX PROD_CNT PROD_INDEX_AVG
1 GHP 1234 5678 상품_A 3 1 3 49.12 7 100
1 GHP 1234 5690 상품_B 4 2 10146 39.8 10 86.76
1 GHP 2345 6010 상품 C 3 11 9675 13.42 16 97.23
2 LTN 3359 1477 상품 D 8 1 -405 15.76 17 34.05
2 LTN 3359 1533 상품 E 6 1 -293 76.87 19 57.44
2 LTN 8876 1967 상품 F 2 3 -4942 62.98 18 76.98

2. To-Be

  열 레이블          
  GHP   LTN   전체 평균 : PROD_INDEX_AVG 전체 합계 : PROD_CNT
행 레이블 평균 : PROD_INDEX_AVG 합계 : PROD_CNT 평균 : PROD_INDEX_AVG 합계 : PROD_CNT    
1477     34.05 17 34.05 17
1533     57.44 19 57.44 19
1967     76.98 18 76.98 18
5678 100 7     100 7
5690 86.76 10     86.76 10
6010 97.23 16     97.23 16
총합계 94.66333333 33 56.15666667 54 75.41 87

 

 

 

by 마농 [2022.04.21 10:12:46]

중간이 비어 있는 형태의 결과표가 왜 그래야 하는지는 이해가 안가지만.
일단 그대로 만들어 봤습니다.

WITH t AS
(
SELECT 1 id, 'GHP' target_id, 1234 team_code, 5678 prod_code, '상품_A' prod_name, 3 target_same, 1 target_low, 3 target_high, 49.12 prod_index, 7 prod_cnt, 100 prod_index_avg
UNION ALL SELECT 1, 'GHP', 1234, 5690, '상품_B', 4,  2, 10146, 39.8 , 10,  86.76
UNION ALL SELECT 1, 'GHP', 2345, 6010, '상품 C', 3, 11,  9675, 13.42, 16,  97.23
UNION ALL SELECT 2, 'LTN', 3359, 1477, '상품 D', 8,  1,  -405, 15.76, 17,  34.05
UNION ALL SELECT 2, 'LTN', 3359, 1533, '상품 E', 6,  1,  -293, 76.87, 19,  57.44
UNION ALL SELECT 2, 'LTN', 8876, 1967, '상품 F', 2,  3, -4942, 62.98, 18,  76.98
)
SELECT prod_code
     , AVG(CASE target_id WHEN 'GHP' THEN prod_index_avg END) prod_index_avg_GHP
     , SUM(CASE target_id WHEN 'GHP' THEN prod_cnt       END) prod_cnt_GHP
     , AVG(CASE target_id WHEN 'LTN' THEN prod_index_avg END) prod_index_avg_LTN
     , SUM(CASE target_id WHEN 'LTN' THEN prod_cnt       END) prod_cnt_LTN
     , AVG(prod_index_avg) prod_index_avg
     , SUM(prod_cnt      ) prod_cnt
  FROM t
 GROUP BY ROLLUP(prod_code)
;

 


by l폭주천사l [2022.04.21 12:03:11]

샘플 데이터를 만들다보니 비어 있는 데이터를 만들게 되었네요... 

실제로는 비어있는 데이터는 아닙니다. 

작성해 주신 쿼리문으로 적용하는데 많은 도움이 될것같습니다. 

정말로 감사드립니다 

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