몇개월 전에 Pivot 구문을 답변으로 받았고, 그 코드를 바탕으로 다른 Pivot 을 작성했습니다.
결과는 원하는대로 나왔지만, 아직도 원리를 이해 못하고 있습니다.
혹시 설명해 주실 분?
WITH sales(t_cd, bin, game) AS ( SELECT 10003202, 1, 331 FROM dual UNION ALL SELECT 10003202, 2, 431 FROM dual UNION ALL SELECT 10003202, 3, 531 FROM dual UNION ALL SELECT 10003202, 4, 631 FROM dual UNION ALL SELECT 10003202, 5, 731 FROM dual UNION ALL SELECT 10003202, 6, 732 FROM dual UNION ALL SELECT 90000202, 1, 101 FROM dual UNION ALL SELECT 90000202, 2, 202 FROM dual UNION ALL SELECT 90000202, 3, 303 FROM dual UNION ALL SELECT 90000202, 4, 404 FROM dual UNION ALL SELECT 90000202, 5, 505 FROM dual UNION ALL SELECT 90000202, 6, 606 FROM dual ) SELECT * FROM sales PIVOT (MIN(game) FOR bin IN ( 1, 2, 3, 4, 5, 6 ) ) ORDER BY t_cd ;
각 1,2,3,4,5,6 를 컬럼으로 나열하고 각각의 컬럼의 값으로 game 필드의 값을 나열하는.
그런데, PIVOT 구문이 어떻게 작동하는지 잘 이해가 안되네요.
bin 을 기준으로 game 이 아래로 나열되어 있다면
PIVOT 을 하면 bin 을 기준으로 game 이 옆으로 나열되는 거죠.
PIVOT 에 표기 하지 않은 항목(t_cd)은 Group By 의 기준이 됩니다.
11G Pivot 구문이 생기기 전에는 다음과 같이 작성했습니다. 비교해 보세요.
SELECT t_cd , MIN(DECODE(bin, 1, game)) "1" , MIN(DECODE(bin, 2, game)) "2" , MIN(DECODE(bin, 3, game)) "3" , MIN(DECODE(bin, 4, game)) "4" , MIN(DECODE(bin, 5, game)) "5" , MIN(DECODE(bin, 6, game)) "6" FROM sales GROUP BY t_cd ;