我有以下查询需要2个参数。SQL Server 2005 - 基于在主要查询中传递的变量的列名称
- YearNumber
- MonthNumber
在我的支点查询,我想基于@Year_Rtl
变量来选择列。我需要选择去年,去年和去年的数据。由于UI上显示的数据是表格格式除以@Year_Rtl
,因此我决定为其编写一个数据透视表,如下所示。
在查询中,如果我硬编码[@Year_Rtl], [@Year_Rtl - 1], [@Year_Rtl - 2]
到[2012], [2011], [2010]
,它工作正常。但是,由于过去的一年可以是任何事情,我希望动态地命名列。
DECLARE @Month_Rtl int
DECLARE @Year_Rtl int
SET @Year_Rtl = 2012
SET @Month_Rtl = 1
SELECT
'Data 1', [@Year_Rtl], [@Year_Rtl - 1], [@Year_Rtl - 2]
FROM
(SELECT [Yr_No], Qty
FROM dbo.Table1 t
WHERE (t.Col1 = 10) AND
(t.Col2 = '673') AND
((t.Mth_No = @Month_Rtl AND t.Yr_No = @Year_Rtl) OR
(t.Mth_No = 12 AND t.Yr_No IN (@Year_Rtl - 1, @Year_Rtl - 2)))
) p PIVOT (SUM(Qty)
FOR [Yr_No] IN ([@Year_Rtl], [@Year_Rtl-1], [@Year_Rtl-2])
) AS pvt
上面的查询抛出以下错误:
错误转换数据类型为nvarchar到SMALLINT。
错误值“@Year_Rtl”在PIVOT运算符中提供。
无效的列名'@Year_Rtl - 1'。
无效的列名'@Year_Rtl - 2'。
参与'PIVOT'的列不能是可变的,使用动态SQL的外部。是的,它很糟糕。这只是它的方式。 – Yuck 2012-02-27 20:07:45
我能够将整个查询创建为动态SQL。想知道它是否会达到性能? – Asdfg 2012-02-27 20:22:42
据我所知,动态列摆动只能通过动态SQL来实现 - 当然,它不会像存储查询计划那样具有良好的性能,但是它或者不具备查询功能。 – 2012-02-27 20:25:11