문제

열이있는 테이블이 있습니다 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 );

그리고 비 임점 데이터를 얻으십시오 ...

당신은 그것을 할 수 있습니다 올랩. 여기 주제에 대한 MSDN 문서에 대한 또 다른 링크입니다.

OLAP를 사용하면 필요한 레이아웃과 함께 큐브를 만들 수 있습니다.

그런 식으로 가고 싶지 않다면 SQLServer 데이터를 조작하기 위해 .NET, Java, TransACSQL 또는 선호하는 언어로 요약 테이블을 만들어야합니다.

이름이있는 행으로 열을 쉽게 전환하려면 XML을 사용해야합니다. 내 블로그에서 나는 이것에 대해 예를 들어 설명했다 : 링크

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top