세로로된 출력을 가로로 pivot 시켜서 보여주는 방법은 아래 방법
말고도
일련번호를 mod() 연산하고 그룹핑 하여 적당히 변형시키는 방법을
많이 씁니다.
(오라클과 같이 rownum 을 지원하는 경우 mod() 연산을 사용하여
많이 쓰죠~)
아래 설명을 참고하시고 경우에 따라 적절히(?) 변형하셔서 사용할
수 있습니다.
-------------------------------------------------------------
크로스탭 보고서
열이 가로로,
행이 세로로 나타나도록 결과를 회전시켜야 할 때가 있습니다. 이러한
작업을
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 테이블을 만들어 첫 번째 테이블의 데이터로 채우는
문입니다.
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 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