Как преобразовать неизвестные значения в столбце в строку с фиксированным столбцом и значением суммы в другом столбце в SQL Server?
Этот пример
| Id | Date | Amount1 | Amount2
+----+------+---------+--------
| 1 | 2018 | 1000 | 100
| 2 | 2018 | 2000 | 200
| 2 | 2018 | 3000 | 300
| 1 | 2019 | 4000 | 400
| 1 | 2019 | 5000 | 500
| .. | .... | .... | ...
я хочу это
| Id | 2018Amount1 | 2018Amount2 | 2019Amount1 | 2019Amount2 | ...
+----+-------------+-------------+-------------+-------------+-------
| 1 | 1000 | 100 | 9000 | 900 | ...
| 2 | 5000 | 500 | 0 | 0 | ...


Используйте условную агрегацию:
select Id,
sum( case when Date = 2018 then Amount1 end ) as "2018Amount1",
sum( case when Date = 2018 then Amount2 end ) as "2018Amount2",
sum( case when Date = 2019 then Amount1 end ) as "2019Amount1",
sum( case when Date = 2019 then Amount2 end ) as "2019Amount2"
from tab
group by Id
Барбарос Ожан, спасибо, но я думаю, что это сделает пивот
@super.Omar Добро пожаловать, Омар, да, у нас есть метод, использующий ключевое слово pivot, но также требующий явного указания для всех возвращаемых столбцов.
@super.Omar Larnu предлагает лучший, динамичный способ.
@ Гордон Линофф, спасибо, мастер, я перепутал фразы :)
Вы можете использовать динамический свод
DECLARE @ColName NVARCHAR(MAX) =''
SELECT @ColName = @ColName + ', '+ ColName
FROM ( SELECT DISTINCT QUOTENAME( CAST([Date] AS VARCHAR(4)) + 'Amount1')
+ ', ' + QUOTENAME(CAST([Date] AS VARCHAR(4)) + 'Amount2') ColName FROM TestTable )T
SET @ColName = STUFF (@ColName,1,1,'')
DECLARE @SqlText NVARCHAR(MAX) =
'SELECT * FROM (
SELECT Id, CAST([Date] AS VARCHAR(4)) + ''Amount1'' AS [Date], Amount1 AS Amount FROM TestTable
UNION
SELECT Id, CAST([Date] AS VARCHAR(4)) + ''Amount2'' [Date], Amount2 AS Amount FROM TestTable
) SRC
PIVOT(SUM(Amount) FOR Date IN (' + @ColName+ ') ) AS PVT'
EXECUTE sp_executesql @SqlText
но значения неизвестны