사용자 도구

사이트 도구


기술문서:레퍼런스:쿼리:응용:pivot_query

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
기술문서:레퍼런스:쿼리:응용:pivot_query [2025/07/29 18:32]
carlito76 ↷ 문서가 개인문서:임시문서:기술문서:레퍼런스:쿼리:응용:pivot_query에서 기술문서:레퍼런스:쿼리:응용:pivot_query(으)로 이동되었습니다
기술문서:레퍼런스:쿼리:응용:pivot_query [2026/01/16 16:19] (현재)
carlito76
줄 10: 줄 10:
 </note> </note>
  
-^  물리명  ^  논리명  ^  타입 +===== 테이블 명세 ===== 
-| 년 | year | 문자형 | +^  물리명  ^  논리명  ^  타입   길이  ^ 
-| 월 | month | 문자형 | +| 년 | year | 문자형 | 100 
-| 일수 | day_cnt | 숫자형 |+| 월 | month | 문자형 | 100 
 +| 일수 | day_cnt | 숫자형 |
  
 +===== SQL 스크립트 =====
 <sxh sql; gutter: true; title: DDL;> <sxh sql; gutter: true; title: DDL;>
 CREATE TABLE ex_pivot ( CREATE TABLE ex_pivot (
줄 40: 줄 42:
 ===== MySQL/MariaDB ===== ===== MySQL/MariaDB =====
 <sxh sql; gutter: true;> <sxh sql; gutter: true;>
--- MySQL 5.0.1 이상/MariaDB 5.1 이상+/* 
 + MySQL 5.0.1 이상/MariaDB 5.1 이상 
 +*/
 SELECT SELECT
  year  year
- , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day + , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day_cnt 
- , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day + , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day_cnt 
- , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day + , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day_cnt 
- , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day + , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day_cnt 
- , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day + , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day_cnt 
- , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day + , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day_cnt 
- , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day + , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day_cnt 
- , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day + , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day_cnt 
- , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day + , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day_cnt 
- , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day + , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day_cnt 
- , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day + , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day_cnt 
- , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day+ , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day_cnt
 FROM FROM
  ex_pivot  ex_pivot
줄 64: 줄 68:
 ===== MSSQL ===== ===== MSSQL =====
 <sxh sql; gutter: true;> <sxh sql; gutter: true;>
--- MSSQL 2000 이상+/* 
 + MSSQL 2000 이상 
 +*/
 SELECT SELECT
  year  year
- , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day + , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day_cnt 
- , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day + , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day_cnt 
- , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day + , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day_cnt 
- , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day + , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day_cnt 
- , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day + , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day_cnt 
- , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day + , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day_cnt 
- , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day + , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day_cnt 
- , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day + , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day_cnt 
- , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day + , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day_cnt 
- , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day + , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day_cnt 
- , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day + , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day_cnt 
- , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day+ , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day_cnt
 FROM FROM
  ex_pivot  ex_pivot
줄 85: 줄 91:
 ; ;
  
--- MSSQL 2005 이상+/* 
 + MSSQL 2005 이상 
 +*/
 SELECT SELECT
  year  year
- , [jan] AS jan_day + , [jan] AS jan_day_cnt 
- , [feb] AS feb_day + , [feb] AS feb_day_cnt 
- , [mar] AS mar_day + , [mar] AS mar_day_cnt 
- , [apr] AS apr_day + , [apr] AS apr_day_cnt 
- , [may] AS may_day + , [may] AS may_day_cnt 
- , [jun] AS jun_day + , [jun] AS jun_day_cnt 
- , [jul] AS jul_day + , [jul] AS jul_day_cnt 
- , [aug] AS aug_day + , [aug] AS aug_day_cnt 
- , [sep] AS sep_day + , [sep] AS sep_day_cnt 
- , [oct] AS oct_day + , [oct] AS oct_day_cnt 
- , [nov] AS nov_day + , [nov] AS nov_day_cnt 
- , [dec] AS dec_day+ , [dec] AS dec_day_cnt
 FROM FROM
  (SELECT  (SELECT
줄 107: 줄 115:
  FROM  FROM
  ex_pivot  ex_pivot
- ) src PIVOT ( + ) src 
- MAX(day_cnt) +PIVOT ( 
- FOR month IN ( + MAX(day_cnt) 
- [jan] + FOR month IN ( 
- , [feb] + [jan] 
- , [mar] + , [feb] 
- , [apr] + , [mar] 
- , [may] + , [apr] 
- , [jun] + , [may] 
- , [jul] + , [jun] 
- , [aug] + , [jul] 
- , [sep] + , [aug] 
- , [oct] + , [sep] 
- , [nov] + , [oct] 
- , [dec] + , [nov] 
- + , [dec] 
- ) pvt+
 +) pvt
 ; ;
 </sxh> </sxh>
줄 129: 줄 138:
 ===== Oracle/Tibero ===== ===== Oracle/Tibero =====
 <sxh sql; gutter: true;> <sxh sql; gutter: true;>
--- Oracle 8.1.6 이상/Tibero 3 이상+/* 
 + Oracle 8i 이상/Tibero 3 이상 
 +*/
 SELECT SELECT
  year  year
- , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day + , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day_cnt 
- , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day + , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day_cnt 
- , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day + , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day_cnt 
- , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day + , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day_cnt 
- , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day + , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day_cnt 
- , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day + , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day_cnt 
- , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day + , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day_cnt 
- , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day + , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day_cnt 
- , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day + , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day_cnt 
- , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day + , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day_cnt 
- , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day + , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day_cnt 
- , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day+ , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day_cnt
 FROM FROM
  ex_pivot  ex_pivot
줄 150: 줄 161:
 ; ;
  
--- Oracle 11g 이상//Tibero 6 이상+/* 
 + Oracle 11g 이상/Tibero 6 이상 
 +*/
 SELECT SELECT
  *  *
줄 160: 줄 173:
  FROM  FROM
  ex_pivot  ex_pivot
- ) PIVOT ( 
- MAX(day_cnt) 
- FOR month IN ( 
- 'jan' AS jan_day 
- , 'feb' AS feb_day 
- , 'mar' AS mar_day 
- , 'apr' AS apr_day 
- , 'may' AS may_day 
- , 'jun' AS jun_day 
- , 'jul' AS jul_day 
- , 'aug' AS aug_day 
- , 'sep' AS sep_day 
- , 'oct' AS oct_day 
- , 'nov' AS nov_day 
- , 'dec' AS dec_day 
- ) 
  )  )
 +PIVOT (
 + MAX(day_cnt)
 + FOR month IN (
 + 'jan' AS jan_day_cnt
 + , 'feb' AS feb_day_cnt
 + , 'mar' AS mar_day_cnt
 + , 'apr' AS apr_day_cnt
 + , 'may' AS may_day_cnt
 + , 'jun' AS jun_day_cnt
 + , 'jul' AS jul_day_cnt
 + , 'aug' AS aug_day_cnt
 + , 'sep' AS sep_day_cnt
 + , 'oct' AS oct_day_cnt
 + , 'nov' AS nov_day_cnt
 + , 'dec' AS dec_day_cnt
 + )
 +)
 ; ;
 </sxh> </sxh>
줄 182: 줄 196:
 ===== PostgreSQL ===== ===== PostgreSQL =====
 <sxh sql; gutter: true;> <sxh sql; gutter: true;>
--- PostgreSQL 7.1 이상+/* 
 + PostgreSQL 7.1 이상 
 +*/
 SELECT SELECT
  year  year
- , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day + , MAX(CASE WHEN month = 'jan' THEN day_cnt ELSE NULL END) AS jan_day_cnt 
- , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day + , MAX(CASE WHEN month = 'feb' THEN day_cnt ELSE NULL END) AS feb_day_cnt 
- , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day + , MAX(CASE WHEN month = 'mar' THEN day_cnt ELSE NULL END) AS mar_day_cnt 
- , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day + , MAX(CASE WHEN month = 'apr' THEN day_cnt ELSE NULL END) AS apr_day_cnt 
- , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day + , MAX(CASE WHEN month = 'may' THEN day_cnt ELSE NULL END) AS may_day_cnt 
- , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day + , MAX(CASE WHEN month = 'jun' THEN day_cnt ELSE NULL END) AS jun_day_cnt 
- , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day + , MAX(CASE WHEN month = 'jul' THEN day_cnt ELSE NULL END) AS jul_day_cnt 
- , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day + , MAX(CASE WHEN month = 'aug' THEN day_cnt ELSE NULL END) AS aug_day_cnt 
- , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day + , MAX(CASE WHEN month = 'sep' THEN day_cnt ELSE NULL END) AS sep_day_cnt 
- , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day + , MAX(CASE WHEN month = 'oct' THEN day_cnt ELSE NULL END) AS oct_day_cnt 
- , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day + , MAX(CASE WHEN month = 'nov' THEN day_cnt ELSE NULL END) AS nov_day_cnt 
- , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day+ , MAX(CASE WHEN month = 'dec' THEN day_cnt ELSE NULL END) AS dec_day_cnt
 FROM FROM
  ex_pivot  ex_pivot
줄 203: 줄 219:
 ; ;
 </sxh> </sxh>
 +
 +{{tag>"쿼리" "Query" "응용"}}