【问题标题】:Pivot query using SQL Server使用 SQL Server 进行数据透视查询
【发布时间】:2015-07-04 09:02:24
【问题描述】:

我需要一个使用 SQL Server 的动态 PIVOT 查询。

id year amount
1  1991  25
1  1992  24
2  1991  25
2  1992  24

如何使用数据透视表更改下表:

id  1991_amount     1992_amount
1   1991_25         1992_24
2   1991_25         1992_24

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    这是我的解决方案。

    首先,如果你不需要动态的,你可以使用这个:

    -- Create demo data
    CREATE TABLE #data (id int, year int, amount int)
    
    INSERT INTO #data(id, year, amount)
    VALUES  (1,1991,25),
        (1,1992,24),
        (2,1991,25),
        (2,1992,24)
    
    -- Your work:
    SELECT pvt.*
    FROM (
        SELECT id, CONVERT(nvarchar(max),year)+N'_amount' as year, 
                CONVERT(nvarchar(max),year)+N'_'+CONVERT(nvarchar(max),amount) as amount 
        FROM #data
    ) as dat
    PIVOT (
        MAX(amount)
        FOR year IN([1991_amount],[1992_amount])
    ) as pvt
    
    -- Cleanup
    DROP TABLE #data
    GO
    

    如果你真的需要一个动态的,你可以改用这个:

    -- Create demo data
    CREATE TABLE #data (id int, year int, amount int)
    
    INSERT INTO #data(id, year, amount)
    VALUES  (1,1991,25),
        (1,1992,24),
        (2,1991,25),
        (2,1992,24)
    
    -- Your work:
    DECLARE @sql nvarchar(max), @columns nvarchar(max)
    
    SELECT @columns = COALESCE(
                @columns + N',['+ CONVERT(nvarchar(max),year) + N'_amount]', N'['+
                CONVERT(nvarchar(max),year) + N'_amount]'
           )
    FROM (
        -- Distinct do avoid duplicated year columns
        SELECT DISTINCT year
        FROM #data
    ) as dat
    
    SET @sql = N'
    SELECT pvt.*
    FROM (
        SELECT id, CONVERT(nvarchar(max),year)+N''_amount'' as year, 
            CONVERT(nvarchar(max),year)+N''_''+ CONVERT(nvarchar(max),amount) as amount 
        FROM #data
    ) as dat
    PIVOT (
        MAX(amount)
        FOR year IN('+@columns+')
    ) as pvt'
    EXEC(@sql)
    
    -- Cleanup
    DROP TABLE #data
    

    只是一个小小的补充。如果您可能对包含idyear 的组有多个金额,则可以将子查询或dat 替换为该子查询以使用SUM 并将它们相加。

    在这种情况下,你替换这个:

    FROM (
        SELECT id, CONVERT(nvarchar(max),year)+N'_amount' as year, 
                CONVERT(nvarchar(max),year)+N'_'+CONVERT(nvarchar(max),amount) as amount 
        FROM #data
    ) as dat
    

    用这个:

    FROM (
        SELECT id, CONVERT(nvarchar(max),year)+N'_amount' as year, 
                CONVERT(nvarchar(max),year)+N'_'+CONVERT(nvarchar(max),SUM(amount)) as amount 
        FROM #data
        GROUP BY id, year
    ) as dat
    

    它将提供以下结果集:

    id          1991_amount  1992_amount
    ----------- ------------ ------------
    1           1991_25      1992_24
    2           1991_25      1992_24
    

    【讨论】:

    • 我需要,它也会影响列标题
    • 是的,我看过。更正了它。抱歉,由于我在平板电脑上没有 SQL Server,因此将其写在记事本和我的脑海中。 :-D 但它现在应该可以工作了。
    • 我需要添加一些字段,如奖金,欠款。如何在代码上方实现
    • ?我不明白你的问题。只需将其添加到表格中即可?
    最近更新 更多