我有一个形状如下的数据集:
我正在尝试将数据转换为以下格式:
如您所见,我想按州和帐户类型对帐户和收入(每月)进行汇总。重要的是要注意我寻求动态解决方案,因为这些不是唯一的值(硬编码不是一个选项!)。
我可以动态地编写什么SQL查询来完成此任务? (因为这些值不是完整数据集中唯一存在的值)。
谢谢!
答案 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)
<强>返回强>
如果有帮助,生成的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