2012-05-03 166 views
0

我有一個名爲#MonthlySales的表,它提取ItemNumber,MonYearNum & UnitsSold。我此樞轉用下面的腳本:SQL Server數據透視表 - 動態

SELECT 
    ITEMNUMBER [SKU] 
    , ISNULL([1-2011], 0) [Jan 11] 
    , ISNULL([2-2011], 0) [Feb 11] 
    , ISNULL([3-2011], 0) [Mar 11] 
    , ISNULL([4-2011], 0) [Apr 11] 
    , ISNULL([5-2011], 0) [May 11] 
    , ISNULL([6-2011], 0) [Jun 11] 
    , ISNULL([7-2011], 0) [Jul 11] 
    , ISNULL([8-2011], 0) [Aug 11] 
    , ISNULL([9-2011], 0) [Sep 11] 
    , ISNULL([10-2011], 0) [Oct 11] 
    , ISNULL([11-2011], 0) [Nov 11] 
    , ISNULL([12-2011], 0) [Dec 11]

, ISNULL([1-2012], 0) [Jan 12] 
, ISNULL([2-2012], 0) [Feb 12] 
, ISNULL([3-2012], 0) [Mar 12] 
, ISNULL([4-2012], 0) [Apr 12] 
, ISNULL([5-2012], 0) [May 12] 
, ISNULL([6-2012], 0) [Jun 12] 
, ISNULL([7-2012], 0) [Jul 12] 
, ISNULL([8-2012], 0) [Aug 12] 
, ISNULL([9-2012], 0) [Sep 12] 
, ISNULL([10-2012], 0) [Oct 12] 
, ISNULL([11-2012], 0) [Nov 12] 
, ISNULL([12-2012], 0) [Dec 12] 

FROM #MONTHLYSALES PIVOT ( SUM(UNITSSOLD)FOR MONTHYEARNUM IN ( [1-2011],[2-2011],[3- 2011-2011],[4-2011],[5-2011],[6-2011],[7-2011],[8-2011],[9-2011],[10-2011],[11-2011] ,[12-2011] ,[1-2012],[2-2012], [3-2012],[4-2012],[5-2012],[6-2012],[7-2012] ,[8-2012],[9-2012],[10-2012],[11-2012],[12-2012] ) )AS TOTSOLDPERMONTH ORDER BY ITEMNUMBER


正如您所看到的,MonthYearNum列被硬編碼爲像1-2011這樣的值。不過,我無法對這些進行硬編碼,因爲它們是動態的 - 取決於運行此報表的哪一天,將從#monthlysales表中返回不同的MonthYearNum值。

有沒有辦法讓我動態地調整返回的值?

TIA

回答

1

是的 - 寫動態SQL。這很複雜,而不是重寫類似的代碼(因爲我是lazy),請參考我的回答this question的樣本。它是一個動態的unpivot代碼,但概念是一樣的。

+0

嘿,謝謝。在你的例子中,GetTableColumnNames函數會是什麼樣子? – Rivka

+0

這是一個由發佈該問題的人定義的函數 - 在上面列出了實際問題中的代碼。 –

0

另外 - 這是輸出到什麼? SSRS,報表生成器,Excel和大多數第三方報表工具將爲您執行交叉製表。

+0

是的。 SQL中的動態樞軸在keister中是一個皇家的痛苦。 –