动态支点 - 不读取' +'标志

时间:2014-05-20 08:20:57

标签: sql

您好我正在尝试运行以下代码,但收到以下错误。告诉我这个问题是由于' + @Cols +',但此代码是从论坛引用的。任何帮助将不胜感激。感谢

错误 Msg 102,Level 15,State 1,Line 27 '附近的语法不正确+ @Cols +'。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(year) 
            FROM [Reporting].[dbo].[FX_Table]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SELECT *
FROM 
(
SELECT
[from],
[Year],
[FX]
FROM [Reporting].[dbo].[FX_Table] WHERE [To] = 'Euro'
GROUP BY
[from],
[Year],
[FX]
) AS S
PIVOT
(
SUM(FX)
FOR [year] IN ' + @Cols + '
)
AS PVT

1 个答案:

答案 0 :(得分:0)

这个怎么样?

SELECT *
FROM (
    SELECT [from],
        [Year],
        [FX]
    FROM [Reporting].[dbo].[FX_Table]
    WHERE [To] = 'Euro'
    GROUP BY [from],
        [Year],
        [FX]
    ) AS S
PIVOT(SUM(FX) FOR [year] IN (
            SELECT DISTINCT year
            FROM [Reporting].[dbo].[FX_Table]
            )) AS PVT

您不必创建变量,您将存储所有值,然后尝试使用IN来检查这些值并过滤它们。

另外,如果你创建一个NVARCHAR变量来保存你的所有年份,那么你将不得不用逗号分割所有这些值,以便将它们与IN一起使用(这将使你的声明变量@Cols无用)。

您在@Cols变量中的内容,就像您现在创建它的方式一样,如下所示(一条记录是年份列表):

enter image description here

但是要使你的IN条款起作用,你需要多条记录,每年都有一条新记录,如下所示:

我希望这能解决你的问题。