동적쿼리

매개변수로 인해 쿼리 스트링이 변경될 수 있다. 그 중에서도 컬럼명이나 테이블명, 데이터베이스 명이 바뀔 수 있을 때 SQL을 실시간으로 작성하여 DBMS가 처리하도록 한 것이다.


피벗

쉽게 설명하면 컬럼에 있는 속성들을 컬럼으로 바꿔서 옆으로 펼치는 것을 말한다.


PIVOT [집계함수] FOR [컬럼명] IN ([컬럼에 있는 속성명])

 

SELECT 절에서 사용할 컬럼중에서 피벗으로 하고 싶은 컬럼을 정해서 FOR뒤에 쓴다. 그리고 IN뒤에는 그 컬럼의 속성들중에 옆으로 펼치고 싶은 속성들을 쓴다. 그리고 이를 기준으로 집계하고싶은 컬럼을  PIVOT뒤에 써주면 된다.


사용할 테이블이다




쿼리


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DECLARE @COL NVARCHAR(255), @SQL NVARCHAR(255);
SET @COL = N'';
 
SELECT @COL += N', P.' + QUOTENAME(WORK_DT +'|'+MAX(WORK_DT_NM))
  FROM TBL1
 WHERE WORK_DT LIKE '201707%'
 GROUP BY WORK_DT;
 
 
SET @SQL = N'SELECT P.CODE, P.NAME,' + STUFF(@COL,1,2,'')+'
               FROM 
               (
                  SELECT A.CODE, A.NAME, A.WORK_DT+''|''+A.WORK_DT_NM AS COL_GBN,
                         A.AMT
                    FROM TBL1 AS A
                   WHERE A.WORK_DT LIKE '2017%
               )AS F
               PIVOT
               (
                   SUM(AMT) FOR COL_GBN IN('
                   +STUFF(REPLACE(@COL, ', P.['',['),1,1,'')
                   + ')
               )AS P
               ORDER BY P.CODE;';
 
 
EXEC SP_EXECUTESQL @SQL
cs


※ QUOTENAME() 필드값에 대괄호([])를 쳐준다. 이 의미는 문자열로 표현하겠다는 의미이다.


   SELECT할때, A즉 TBL1테이블에 있는 컬럼을 SELECT할 수 없다.(FROM 후에 PIVOT이 실행되어서 테이블형태를

   PIVOT실행후 형태로 가지고있는듯)

결과



참조링크(UNPIVOT과 PIVOT에 대하여)


'SQL > MS-SQL' 카테고리의 다른 글

특정경우를 만족하는 행 SELECT  (0) 2017.09.04
FOR XML  (0) 2017.09.04
WINDOW FUNCTION  (0) 2017.09.04
sp_executesql  (0) 2017.09.03
재귀쿼리  (0) 2017.09.02

+ Recent posts