SQL Server : 행을 열로 변환합니다
-
03-07-2019 - |
문제
열이있는 테이블이 있습니다 sales(int)
, month(int)
. 매달 해당 매월의 판매량을 검색하고 싶습니다. 각 열 (월)에 대한 판매를 포함하는 단일 레코드가있는 매월에 해당하는 12 개의 열 형태의 OUPUT가 필요합니다.
해결책
당신은 살펴 봐야합니다 피벗 열로 행을 전환합니다. 이렇게하면 매월 선택한 명세서가 방지됩니다. 이 같은:
DECLARE @salesTable TABLE
(
[month] INT,
sales INT
)
-- Note that I use SQL Server 2008 INSERT syntax here for inserting
-- multiple rows in one statement!
INSERT INTO @salesTable
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2)
,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2)
,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2)
,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2)
SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]
FROM
(
SELECT [month], sales
FROM @salesTable
) AS SourceTable
PIVOT
(
SUM(sales)
FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable
다른 팁
예쁘지는 않지만 이것은 잘 작동합니다
SELECT
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12]
다음은 약간 더 많은 컨트롤을 제공하는 피벗을 작성하는 대체 방법입니다 (특히 열 이름을 통해). 동적 SQL을 생성하는 것이 조금 더 쉽습니다.
로빈의 대답과 비슷하지만 테이블을 한 번만 치는 장점이 있습니다.
select
Sales1 = sum( case when Month = 1 then Sales end )
, Sales2 = sum( case when Month = 2 then Sales end )
, Sales3 = sum( case when Month = 3 then Sales end )
-- etc..
from SalesTable;
나는 약간의 조사를했는데 새로운 피벗 연산자가 이러한 유형의 쿼리에 대한 구문 설탕 인 것 같습니다. 쿼리 계획은 동일하게 보입니다.
흥미로운 바로 제쳐두고, 비 vit 봇 연산자는 단지 구문 설탕 인 것 같습니다. 예를 들어:
다음과 같은 테이블이있는 경우
Create Table Sales ( JanSales int, FebSales int, MarchSales int...)
당신은 쓸 수 있습니다:
select unpivoted.monthName, unpivoted.sales
from Sales s
outer apply (
select 'Jan', JanSales union all
select 'Feb', FebSales union all
select 'March', MarchSales
) unpivoted( monthName, sales );
그리고 비 임점 데이터를 얻으십시오 ...
이름이있는 행으로 열을 쉽게 전환하려면 XML을 사용해야합니다. 내 블로그에서 나는 이것에 대해 예를 들어 설명했다 : 링크
제휴하지 않습니다 StackOverflow