안녕하세요, 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 |
중간이 비어 있는 형태의 결과표가 왜 그래야 하는지는 이해가 안가지만.
일단 그대로 만들어 봤습니다.
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) ;