{{htmlmetatags> metatag-description=(언피벗 쿼리, Unpivot Query, 언피벗, Unpivot, 데이터베이스, DBMS, SQL, MySQL, MariaDB, MSSQL, Oracle, Tibero, PostgreSQL) metatag-og:description=(언피벗 쿼리, Unpivot Query, 언피벗, Unpivot, 데이터베이스, DBMS, SQL, MySQL, MariaDB, MSSQL, Oracle, Tibero, PostgreSQL) }} ====== Unpivot Query ====== 최소 지원 버전은 약간의 차이가 있을 수 있습니다. ===== 테이블 명세 ===== ^ 물리명 ^ 논리명 ^ 타입 ^ 길이 ^ | 년 | year | 문자형 | 100 | | 1월 일수 | jan_day_cnt | 숫자형 | | | 2월 일수 | feb_day_cnt | 숫자형 | | | 3월 일수 | mar_day_cnt | 숫자형 | | | 4월 일수 | apr_day_cnt | 숫자형 | | | 5월 일수 | may_day_cnt | 숫자형 | | | 6월 일수 | jun_day_cnt | 숫자형 | | | 7월 일수 | jul_day_cnt | 숫자형 | | | 8월 일수 | aug_day_cnt | 숫자형 | | | 9월 일수 | sep_day_cnt | 숫자형 | | | 10월 일수 | oct_day_cnt | 숫자형 | | | 11월 일수 | nov_day_cnt | 숫자형 | | | 12월 일수 | dec_day_cnt | 숫자형 | | ===== SQL 스크립트 ===== CREATE TABLE ex_unpivot ( year VARCHAR(100) NOT NULL, jan_day_cnt INT NOT NULL, feb_day_cnt INT NOT NULL, mar_day_cnt INT NOT NULL, apr_day_cnt INT NOT NULL, may_day_cnt INT NOT NULL, jun_day_cnt INT NOT NULL, jul_day_cnt INT NOT NULL, aug_day_cnt INT NOT NULL, sep_day_cnt INT NOT NULL, oct_day_cnt INT NOT NULL, nov_day_cnt INT NOT NULL, dec_day_cnt INT NOT NULL ); INSERT INTO ex_unpivot ( year , jan_day_cnt, feb_day_cnt, mar_day_cnt , apr_day_cnt, may_day_cnt, jun_day_cnt , jul_day_cnt, aug_day_cnt, sep_day_cnt , oct_day_cnt, nov_day_cnt, dec_day_cnt ) VALUES ( '2025' , 31, 28, 31 , 30, 31, 30 , 31, 31, 30 , 31, 30, 31 ); ===== MySQL/MariaDB ===== /* MySQL 4.0 이상/MariaDB 5.1 이상 */ SELECT year , 'jan' AS month , jan_day_cnt AS day_cnt FROM ex_unpivot UNION ALL SELECT year , 'feb' , feb_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'mar' , mar_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'apr' , apr_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'may' , may_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jun' , jun_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jul' , jul_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'aug' , aug_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'sep' , sep_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'oct' , oct_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'nov' , nov_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'dec' , dec_day_cnt FROM ex_unpivot ; ===== MSSQL ===== /* MSSQL 2000 이상 */ SELECT year , 'jan' AS month , jan_day_cnt AS day_cnt FROM ex_unpivot UNION ALL SELECT year , 'feb' , feb_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'mar' , mar_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'apr' , apr_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'may' , may_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jun' , jun_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jul' , jul_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'aug' , aug_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'sep' , sep_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'oct' , oct_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'nov' , nov_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'dec' , dec_day_cnt FROM ex_unpivot ; /* MSSQL 2005 이상 */ SELECT year , REPLACE(month, '_day_cnt', '') AS month , day_cnt FROM ( SELECT year , jan_day_cnt , feb_day_cnt , mar_day_cnt , apr_day_cnt , may_day_cnt , jun_day_cnt , jul_day_cnt , aug_day_cnt , sep_day_cnt , oct_day_cnt , nov_day_cnt , dec_day_cnt FROM ex_unpivot ) src UNPIVOT ( day_cnt FOR month IN ( jan_day_cnt , feb_day_cnt , mar_day_cnt , apr_day_cnt , may_day_cnt , jun_day_cnt , jul_day_cnt , aug_day_cnt , sep_day_cnt , oct_day_cnt , nov_day_cnt , dec_day_cnt ) ) unpvt ; ===== Oracle/Tibero ===== /* Oracle 9i 이상/Tibero 4 이상 */ SELECT year , 'jan' AS month , jan_day_cnt AS day_cnt FROM ex_unpivot UNION ALL SELECT year , 'feb' , feb_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'mar' , mar_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'apr' , apr_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'may' , may_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jun' , jun_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jul' , jul_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'aug' , aug_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'sep' , sep_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'oct' , oct_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'nov' , nov_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'dec' , dec_day_cnt FROM ex_unpivot ; /* Oracle 11g 이상/Tibero 6 이상 */ SELECT year , month , day_cnt FROM ex_unpivot UNPIVOT ( day_cnt FOR month IN ( jan_day_cnt AS 'jan' , feb_day_cnt AS 'feb' , mar_day_cnt AS 'mar' , apr_day_cnt AS 'apr' , may_day_cnt AS 'may' , jun_day_cnt AS 'jun' , jul_day_cnt AS 'jul' , aug_day_cnt AS 'aug' , sep_day_cnt AS 'sep' , oct_day_cnt AS 'oct' , nov_day_cnt AS 'nov' , dec_day_cnt AS 'dec' ) ) ; ===== PostgreSQL ===== /* PostgreSQL 7.1 이상 */ SELECT year , 'jan' AS month , jan_day_cnt AS day_cnt FROM ex_unpivot UNION ALL SELECT year , 'feb' , feb_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'mar' , mar_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'apr' , apr_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'may' , may_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jun' , jun_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'jul' , jul_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'aug' , aug_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'sep' , sep_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'oct' , oct_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'nov' , nov_day_cnt FROM ex_unpivot UNION ALL SELECT year , 'dec' , dec_day_cnt FROM ex_unpivot ; {{tag>"쿼리" "Query" "응용"}}