본문 바로가기

일 얘기

크로스탭 보고서 SQL Server 온라인 설명서 내용

열이 가로로, 행이 세로로 나타나도록 결과를 회전시켜야 할 때가 있습니다. 이러한 작업을 PivotTable®이나 크로스탭 보고서 만들기 또는 데이터의 회전이라고 합니다.

분기마다 행을 하나씩 갖는 테이블 Pivot이 있다고 가정합니다. Pivot의 SELECT는 각 분기를 세로로 보여줍니다.

Year      Quarter      Amount
----      -------      ------
1990      1           1.1
1990      2           1.2
1990      3           1.3
1990      4           1.4
1991      1           2.1
1991      2           2.2
1991      3           2.3
1991      4           2.4

다음과 같이 연도별 행과 분기별 열을 갖는 테이블로 구성된 보고서가 만들어집니다.

Year
Q1
Q2
Q3
Q4
1990
1.1
1.2
1.3
1.4
1991
2.1
2.2
2.3
2.4

다음은 Pivot 테이블을 만들어 첫 번째 테이블의 데이터로 채우는 문입니다.

USE Northwind
GO

CREATE TABLE Pivot
( Year      SMALLINT,
  Quarter   TINYINT, 
  Amount      DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO

다음은 회전된 결과를 만드는 데 사용하는 SELECT 문입니다.

SELECT Year, 
    SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
    SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
    SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
    SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO

이 SELECT 문은 분기마다 여러 행을 갖는 테이블도 처리합니다. GROUP BY는 주어진 연도의 Pivot의 모든 행을 결합하여 하나의 행으로 출력합니다. 그룹화 연산이 수행될 때 SUM 집계 속의 CASE함수는 결과 집합의 정확한 열에 각 분기의 Amount 값이 더해지고 다른 분기의 결과 집합 열에는 0이 더해지는 방식으로 응용됩니다.

이 SELECT 문의 결과가 스프레드시트의 입력으로 사용된다면 스프레드시트에서 각 연도의 합계가 쉽게 계산됩니다. 응용 프로그램에서 SELECT 문을 사용하면 연도별 합계를 계산하는 SELECT 문의 성능을 쉽게 향상시킬 수 있습니다. 다음 예를 참조하십시오.

SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
             SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
             SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
             SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
             SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
     FROM Pivot AS P
     GROUP BY P.Year) AS P1
GO

CUBE를 가진 GROUP BY 및 ROLLUP을 가진 GROUP BY는 모두 예제에서처럼 같은 종류의 정보를 계산하지만 형식은 다릅니다.