如何制作动态数据透视表?

问题描述 投票:0回答:4

我收到错误消息 -

Msg 102, Level 15, State 1, Line 5 Incorrect syntax near ','.
当我运行以下查询时。我不明白为什么语法不正确。有人有什么建议吗?

sql-server syntax-error pivot-table
4个回答
1
投票

错误消息不是很有帮助,但如果您查看生成的查询和其中的第五行,您会发现发生错误是因为您尝试从使用不正确名称的列中进行选择。

您使用列名称创建临时表

[Row], [Columns], [AggData]

但是当您选择并从中旋转时,您将使用这些列名称

Row, Column, Aggregate

这效果不太好。解决方案是在

@query
中使用正确的列名称。


0
投票

语句之间缺少分号?

例如,在

create table
insert into
之间 ...


0
投票

首先,我建议为变量声明默认的空值,然后以稍微不同的方式连接行。

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;

这应该有效。


0
投票

我很确定您刚刚定义的列字符串是错误的。我没有测试过,只是阅读一下。但你的列字符串类似于

,[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
© www.soinside.com 2019 - 2024. All rights reserved.