【问题标题】:SQL Server - Dynamic Pivot with 2 Group Variables and 2 Aggregate CalculationsSQL Server - 具有 2 个组变量和 2 个聚合计算的动态枢轴
【发布时间】:2018-08-18 14:38:40
【问题描述】:

我有一个形状像这样的数据集:

我正在尝试将数据转换为这种格式:

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

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

谢谢!

【问题讨论】:

  • 明确地说,动态行不是我的问题。您是否需要动态列,即 Accounts、Revenue、EXPENSE、...?
  • 换句话说,您的来源是否有除 Accounts 和 Revenue 以外的更多列?
  • 嗨,约翰,感谢您的提问...就本问题而言,假设此数据集是完整的数据集。换句话说,帐户和收入是唯一感兴趣的字段。
  • 你可能会觉得codeproject.com/Articles/796651/…很有趣

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


【解决方案1】:

我假设您想按日期保持列的顺序,因此我们生成列的部分中的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多