2016-11-19 26 views
2

我在设计过程中会遇到困难,该问题会在后面的表格中给出的聚合表上执行。程序应动态采取从Sales.Month所有条目和数据透视表上使用聚合传递到过程,因此,例如,如果我们将通过SUM(使用VARCHAR传递,然后EXEC对动态创建查询)销售:执行没有PIVOT运算符的数据透视表

销售:

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 

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

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

+2

谷歌:“SQL Server动态数据透视表”。 –

+0

但我不能使用PIVOT运算符。借助枢轴,它将变得如此简单。 – Ernio

+0

。 。为什么你不能使用'pivot'?另外,有传言说它有条件聚合通常更快。 –

回答

4

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

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

Declare @SQL varchar(max)='' 
Select @SQL = @SQL+','+MMM+'='[email protected]+'(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'[email protected]+' 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 

FYI:动态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