使用SQL Server进行数据透视查询

时间:2015-07-04 09:02:25

标签: sql sql-server pivot

我需要使用SQL Server进行动态PIVOT查询。

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

如何使用pivot更改下表:

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

1 个答案:

答案 0 :(得分:2)

这是我的解决方案。

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

[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock];

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

-- 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 id的群组有多个金额,则可以将子查询或year替换为此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