SQL Server - 具有2个组变量和2个聚合计算的动态数据透视表

时间:2018-03-09 23:27:11

标签: sql sql-server dynamic pivot aggregate-functions

我有一个形状如下的数据集:

enter image description here

我正在尝试将数据转换为以下格式:

enter image description here

如您所见,我想按州和帐户类型对帐户和收入(每月)进行汇总。重要的是要注意我寻求动态解决方案,因为这些不是唯一的值(硬编码不是一个选项!)。

我可以动态地编写什么SQL查询来完成此任务? (因为这些值不是完整数据集中唯一存在的值)。

谢谢!

1 个答案:

答案 0 :(得分:5)

我假设您希望按日期按顺序保留列,因此我们生成列的部分中的top 100 percent ... order by

示例

Declare @SQL varchar(max) = '
Select *
 From  ( 
        Select [State]
              ,[AccountType]
              ,B.*
         From YourTable A
         Cross Apply ( values (concat(''Accounts_'',format([Date],''MM/dd/yyyy'')),Accounts)
                             ,(concat(''Revenue_'' ,format([Date],''MM/dd/yyyy'')),Revenue)
                     ) B  (Item,Value)

       ) A
 Pivot (sum([Value]) For [Item] in (' + Stuff((Select ','+QuoteName('Accounts_'+format([Date],'MM/dd/yyyy')) 
                                                     +','+QuoteName('Revenue_' +format([Date],'MM/dd/yyyy'))
                                                 From (Select top 100 percent [Date] from YourTable Group By [Date] Order by [Date] ) A  
                                                 For XML Path('')),1,1,'')  + ') ) p'
--Print @SQL
Exec(@SQL)

<强>返回

enter image description here

如果有帮助,生成的SQL如下所示:

Select *
 From  ( 
        Select [State]
              ,[AccountType]
              ,B.*
         From YourTable A
         Cross Apply ( values (concat('Accounts_',format([Date],'MM/dd/yyyy')),Accounts)
                             ,(concat('Revenue_' ,format([Date],'MM/dd/yyyy')),Revenue)
                     ) B  (Item,Value)

       ) A
 Pivot (sum([Value]) For [Item] in ([Accounts_12/31/2017],[Revenue_12/31/2017],[Accounts_01/31/2018],[Revenue_01/31/2018]) ) p