【问题标题】:Perform pivot without PIVOT operator在没有 PIVOT 运算符的情况下执行枢轴
【发布时间】:2016-11-19 13:15:21
【问题描述】:

我在设计将在稍后给出的表格上使用给定聚合执行数据透视的过程时遇到困难。过程应该动态地从 Sales.Month 中获取所有条目,并使用传递到过程中的聚合对其进行数据透视表,例如,如果我们将 SUM(使用 VARCHAR 传递,然后在动态创建的查询上执行 EXEC)传递给 Sales :

销售:

Item   Month  Price
-------------------
Book     Jan    230
Book     Jan    100
Game     Jan     50
Game     Feb     80
Stick    Mar    190

总计:(“透视”)

Item     Jan   Feb   Mar
------------------------
Book     330  null  null
Game      50    80  null
Stick   null  null   190

我真的想不出能让我这样做的语法。

编辑说明:这里的主要困难实际上是“不使用'native' PIVOT”。

【问题讨论】:

  • 谷歌:“SQL Server 动态数据透视”。
  • 但我不能使用 PIVOT 运算符。使用 pivot 会容易得多。
  • 。 .为什么不能使用pivot?此外,传闻它具有条件聚合通常更快。

标签: sql sql-server pivot pivot-table


【解决方案1】:

您可能会注意到我有一个子查询来保持月份列的正确顺序。此外,我更喜欢条件聚合,因为它更容易添加额外的列(即总计)

Declare @Agg varchar(25) = 'SUM'  -- Try Min, Max, Avg, ...

Declare @SQL varchar(max)=''
Select @SQL = @SQL+','+MMM+'='+@Agg+'(case when Month='''+MMM+''' then Price else null end)'
 From (Select MM,MMM From (Values(1,'Jan'),(2,'Feb'),(3,'Mar'),(4,'Apr'),(5,'May'),(6,'Jun'),(7,'Jul'),(8,'Aug'),(9,'Sep'),(10,'Oct'),(11,'Nov'),(12,'Dec')) M(MM,MMM)) A
 Where MMM in (Select Distinct Month from Yourtable)
 Order By MM

Select @SQL='Select Item'+@SQL+' From Yourtable Group By Item'
Exec(@SQL)

返回

Item    Jan     Feb     Mar
Book    330.00  NULL    NULL
Game    50.00   80.00   NULL
Stick   NULL    NULL    190.00

仅供参考:生成的动态 SQL:

Select Item
      ,Jan=SUM(case when Month='Jan' then Price else null end)
      ,Feb=SUM(case when Month='Feb' then Price else null end)
      ,Mar=SUM(case when Month='Mar' then Price else null end) 
 From Yourtable 
 Group By Item

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多