2012-05-03 130 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中是一个皇家的痛苦。 –