2016-11-19 55 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