동적쿼리
매개변수로 인해 쿼리 스트링이 변경될 수 있다. 그 중에서도 컬럼명이나 테이블명, 데이터베이스 명이 바뀔 수 있을 때 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실행후 형태로 가지고있는듯)
결과
'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 |