我收到错误消息 -
Msg 102, Level 15, State 1, Line 5 Incorrect syntax near ','.
当我运行以下查询时。我不明白为什么语法不正确。有人有什么建议吗?
错误消息不是很有帮助,但如果您查看生成的查询和其中的第五行,您会发现发生错误是因为您尝试从使用不正确名称的列中进行选择。
您使用列名称创建临时表
[Row], [Columns], [AggData]
但是当您选择并从中旋转时,您将使用这些列名称
Row, Column, Aggregate
这效果不太好。解决方案是在
@query
中使用正确的列名称。
语句之间缺少分号?
例如,在
create table
和 insert into
之间 ...
首先,我建议为变量声明默认的空值,然后以稍微不同的方式连接行。
DECLARE @Cols AS NVARCHAR(MAX) = ''
, @Query AS NVARCHAR(MAX) = '';
SELECT @Cols += N',' + QUOTENAME(P.Columns)
FROM (
SELECT DISTINCT P.Columns
FROM #PivotData AS P
) AS P;
-- Generated list should like this:
-- ,[column1],[column2],[column3]...[columnN]
-- Only first comma has to be removed in PIVOT
SET @Query += N'SELECT P.Row ' + @Cols + '
FROM (
SELECT Row, Column, Aggregate
FROM #PivotData
) AS S
PIVOT (
SUM(Aggregate)
FOR Row IN (' + STUFF(@Cols, 1, 1, '') + ')
) AS P';
--PRINT @Query;
EXECUTE @Query;
这应该有效。
我很确定您刚刚定义的列字符串是错误的。我没有测试过,只是阅读一下。但你的列字符串类似于
,[1],[2]
。
开头的,
就是错误的。试试这个:
DECLARE @Vendor AS INT = 41
CREATE TABLE #PivotData
(
[ID] INT,
[Row] VARCHAR(MAX),
[Columns] VARCHAR(MAX),
[AggData] INT
)
INSERT INTO #PivotData
SELECT V.Vendor_Key
,O.Location_Desc
,P.Item_Desc
,IIF.Sales_Qty
FROM PDI.PDI_Warehouse_952_01.dbo.Item_Inventory_Fact IIF
INNER JOIN PDI.PDI_Warehouse_952_01.dbo.Item_Purchases_Fact IPF
ON IIF.Calendar_Key = IPF.Calendar_Key
AND IIF.Organization_Key = IPF.Organization_Key
AND IIF.Product_Key = IPF.Product_Key
INNER JOIN PDI.PDI_Warehouse_952_01.dbo.Organization O
ON IIF.Organization_Key = O.Organization_Key
INNER JOIN PDI.PDI_Warehouse_952_01.dbo.Product P
ON IIF.Product_Key = P.Product_Key
INNER JOIN PDI.PDI_Warehouse_952_01.dbo.Vendor V
ON IPF.Vendor_Key = V.Vendor_Key
WHERE V.Vendor_key = @Vendor
DECLARE @Cols AS NVARCHAR(MAX),
@Query AS NVARCHAR(MAX)
SELECT @Cols = COALESCE(@Cols + N',['+P.Columns+N']',
N'['+P.Columns+']')
FROM (SELECT DISTINCT Columns FROM #PivotData) P
SET @Query = 'SELECT Row, ' + @Cols + ' FROM
(
SELECT Row
,Column
,Aggregate
FROM #PivotData
)x
PIVOT
(
SUM(Aggregate)
FOR Row IN (' + @Cols + ')
) p '
EXECUTE(@Query)
DROP TABLE #PivotData