我需要使用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
答案 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