簡體   English   中英

具有動態年份列的數據透視表

[英]Pivot SQL table with dynamic year columns

我很難弄清楚這一點。 我已經檢查了類似的帖子,但它們只有一列作為樞軸旋轉。 雖然我需要旋轉

我有以下查詢:

SELECT  
      Year([Date]) as Year
      ,SUM([Drop]) as [Drop]
      ,SUM([TicketsDistributed]) as [TicketsDistributed]
      ,SUM([TicketsSold]) as [TicketsSold]
      ,SUM([GrossTickets]) as [GrossTickets]
      ,SUM([GrossTickets])/SUM(TicketsSold) as 'Per Cap'
  FROM [dbo].[Tickets]
  group by [Date]

這給我這個結果:

Year    Drop    TicketsDistributed  TicketsSold GrossTickets    Per Cap
2016    222          100                 5000     4000.00       0.800000
2015    222          110                 5000     4000.00       0.900000
2014    222          120                 5000     4000.00       1.00000

我想要以下內容:

                       2016   2015   2014   
Drop                   222    222    222    
TicketsDistributed     100    110    120    
TicketsSold            5000   5000   5000     
GrossTickets           4000   4000   4000
Per Cap                0.8     0.9   1

根據建議的答案,這是我到目前為止所擁有的,但無法正常工作

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Year(Date)) 
                    from [dbo].[SpringTrainings] t
                    cross apply
                    (
                        select    SUM([Drop]) as [Drop]
      ,SUM([TicketsDistributed]) as [TicketsDistributed]
      ,SUM([TicketsSold]) as [TicketsSold]
      ,SUM([GrossTickets]) as [GrossTickets]
      ,SUM([GrossTickets])/SUM(TicketsSold) as PerCap
  FROM [dbo].[SpringTrainings]
                    ) c ([Drop],[TicketsDistributed],[TicketsSold],[GrossTickets],PerCap)
                    group by Year(Date)
                    order by Year(Date)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')




set @query = 'SELECT [Drop],[TicketsDistributed],[TicketsSold],[GrossTickets],PerCap,' + @cols + ' 
            from 
            (
                select SUM([Drop]) as [Drop]
      ,SUM([TicketsDistributed]) as [TicketsDistributed]
      ,SUM([TicketsSold]) as [TicketsSold]
      ,SUM([GrossTickets]) as [GrossTickets]
      ,SUM([GrossTickets])/SUM(TicketsSold) as PerCap
        FROM [dbo].[SpringTrainings]

            ) x
            pivot 
            (
                max(Year([Date]))
                for Year([Date]) in (' + @cols + ')
            ) p '

execute sp_executesql @query;

如果希望在T-SQL中繼續使用數據透視運算符,則首先需要“取消透視”現有查詢,以便具有Year,Label和Value。 雖然我個人在T-SQL中有一個可靠的運算符,但我發現使用CROSS APPLY和VALUES更加簡單,同樣快捷(有關Brad Schultz的更多信息,請閱讀 Brad Schultz的文章 ),我特別喜歡它,因為我可以直觀地看到結果順便說一下,我對值對進行布局。

SELECT
      d.Year
    , a.label
    , a.value
FROM (
      SELECT
            YEAR([Date]) AS [Year]
          , SUM([Drop]) AS [Drop]
          , SUM([TicketsDistributed]) AS [TicketsDistributed]
          , SUM([TicketsSold]) AS [TicketsSold]
          , SUM([GrossTickets]) AS [GrossTickets]
          , SUM([GrossTickets]) / SUM(TicketsSold) AS [PerCap]
      FROM [dbo].[Tickets]
      GROUP BY
            [Year]
      ) AS t
      CROSS APPLY ( /* now transform into 5 rows per year but just 1 value column */
          VALUES
                 ('Drop',t.Drop)
               , ('TicketsDistributed',t.TicketsDistributed)
               , ('TicketsSold',t.TicketsSold)
               , ('GrossTickets',t.GrossTickets)
               , ('PerCap',t.PerCap)
      ) AS a (label, value)

該查詢(上面)替換了動態SQL中的派生表x 一旦將數據整理成表格,數據透視表就會變得更加簡單:

       ) x
        pivot 
        (
            max([x.Value])
            for [x.Year] in ([2014],[2015],[2016])
        ) p

對於您的@cols,我建議這樣的簡單操作:

SELECT DISTINCT
    QUOTENAME(Year([date])) 
FROM [dbo].[Tickets]

提示 :如果您需要一種排序行的方法,也可以將其包括在十字架中,如下所示:

      CROSS APPLY ( /* now transform into 5 rows per year but just 1 value column */
          VALUES
                 (1, 'Drop',t.Drop)
               , (2, 'TicketsDistributed',t.TicketsDistributed)
               , (3, 'TicketsSold',t.TicketsSold)
               , (4, 'GrossTickets',t.GrossTickets)
               , (5, 'PerCap',t.PerCap)
      ) AS a (row_order, label, value)

然后可以在執行數據透視后使用[row_order]。

因此整體看起來像這樣:

DECLARE @cols AS nvarchar(max)
      , @query AS nvarchar(max)

SELECT @cols = STUFF((
            SELECT DISTINCT
                  ',' + QUOTENAME(YEAR([date]))
            FROM [dbo].[Tickets]
            FOR xml PATH (''), TYPE
      )
      .value('.', 'NVARCHAR(MAX)')
      , 1, 1, '')


SET @query = 'SELECT [Year], [Label], '
            + @cols 
            + ' FROM (
                  SELECT
                        d.Year
                      , a.label
                      , a.value
                  FROM (
                        SELECT
                              YEAR([Date]) AS [Year]
                            , SUM([Drop]) AS [Drop]
                            , SUM([TicketsDistributed]) AS [TicketsDistributed]
                            , SUM([TicketsSold]) AS [TicketsSold]
                            , SUM([GrossTickets]) AS [GrossTickets]
                            , SUM([GrossTickets]) / SUM(TicketsSold) AS [PerCap]
                        FROM [dbo].[Tickets]
                        GROUP BY
                              [Year]
                  ) AS d
                        CROSS APPLY (
                                  VALUES
                                         (1,''Drop'',t.Drop)
                                       , (2,''TicketsDistributed'',t.TicketsDistributed)
                                       , (3,''TicketsSold'',t.TicketsSold)
                                       , (4,''GrossTickets'',t.GrossTickets)
                                       , (5,''PerCap'',t.PerCap)
                        ) AS a (row_order,label,value)
                ) x
            pivot 
            (
                max([x.Value])
                for [x.Year] in (' + @cols + ')
            ) p
            ORDER BY [row_order]'

EXECUTE sp_executesql @query;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM