来自动态列的SQL数据透视表

时间:2018-05-21 11:17:01

标签: sql sql-server pivot-table

我写了这个查询来生成数据透视表

SELECT *
FROM (
    SELECT 
        ItemName_AR as [ItemName], 
        NetValue as Amount 
    FROM view_WH_CompanyTransactionDtl
) as s
PIVOT
(
    SUM(Amount)
    FOR [ItemName] IN (select ItemName_AR from WH_Items)
)AS pvt

但它会导致

中的以下错误
  

关键字“select”附近的语法不正确。

在此声明中

FOR [ItemName] IN (select ItemName_AR from WH_Items)

2 个答案:

答案 0 :(得分:2)

不幸的是,您可能不会使用select语句来提供各种值(unpivoted form)= columns(pivoted form)。你可以使用 IN ([value1],[value2])等 或考虑动态解决方案,这是一个链接: SQL Server Dynamic Pivot Column Names

答案 1 :(得分:0)

您无法像这样创建动态SQL PIVOT。你可以试试这样的......

DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ',' + Quotename(ItemName_AR)
         FROM   WH_Items       
         FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

DECLARE @query AS NVARCHAR(max) =  'SELECT *
                                    FROM (
                                        SELECT 
                                            ItemName_AR as [ItemName], 
                                            NetValue as Amount 
                                        FROM view_WH_CompanyTransactionDtl
                                    ) as s
                                    PIVOT
                                    (
                                        SUM(Amount)
                                        FOR [ItemName] IN ('+ @cols +')
                                    )AS pvt';

EXECUTE(@query)