Как преобразовать неизвестные значения в столбце в строку в SQL Server

Как преобразовать неизвестные значения в столбце в строку с фиксированным столбцом и значением суммы в другом столбце в 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         | ...
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте условную агрегацию:

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 05.03.2019 12:17

Барбарос Ожан, спасибо, но я думаю, что это сделает пивот

super.Omar 05.03.2019 12:37

@super.Omar Добро пожаловать, Омар, да, у нас есть метод, использующий ключевое слово pivot, но также требующий явного указания для всех возвращаемых столбцов.

Barbaros Özhan 05.03.2019 12:39

@super.Omar Larnu предлагает лучший, динамичный способ.

Barbaros Özhan 05.03.2019 12:41
В основе проблемы у меня это | Идентификатор | Дата | Сумма1 +----+------+-------- | 1 | 2018 | 3000 | 1 | 2019 | -3000 | 1 | 2019 | 3000 | .. | .... | .... Как я это понимаю | Идентификатор | Дата2018 | Дата2019 +----+------+-------- | 1 | 3000 | 0 | .. | .... | .... мне это не нужно | Идентификатор | Дата2018 | Дата2019 +----+------+-------- | 1 | 0 | 3000 | .. | .... | ....
super.Omar 05.03.2019 12:47

@ Гордон Линофф, спасибо, мастер, я перепутал фразы :)

Barbaros Özhan 05.03.2019 12:48
Ответ принят как подходящий

Вы можете использовать динамический свод

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

Другие вопросы по теме