MSSQL перевернуть строки в столбцы
Ищу способ перевернуть строки в стобцы в MSSQL. Так выглядит моя таблица:
Пытался сделать так
SELECT ta.AuftragID,
SUM(CASE
WHEN [Abteilung] = 'Konstruktion' THEN [PlanAufwand]
END) AS Konstruktion,
SUM(CASE
WHEN [Abteilung] = 'Mechanik' THEN [PlanAufwand]
END) AS Mechanik,
SUM(CASE
WHEN [Abteilung] = 'Verdrahtung' THEN [PlanAufwand]
END) AS Verdrahtung
FROM Terminliste_Abteilungsablauf ta
Однако, из за того, что AuftragID стоит не один раз, получаю что-то вроде этого

Резуальтат должен выглядить примерно так, может у кого есть решение.
AuftragsID Konstruktion Mechanik Verdrahtung
22103776 10 10 10
22103777 5 2 1
Пример https://data.stackexchange.com/stackoverflow/query/1453280/pivot
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
Ваш способ:
SELECT ta.Auftrag,
MAX( CASE WHEN [Abteilung] = 'Konstruktion'
THEN [PlanAufwand]
END ) AS Konstruktion,
MAX( CASE WHEN [Abteilung] = 'Mechanik'
THEN [PlanAufwand]
END ) AS Mechanik,
MAX( CASE WHEN [Abteilung] = 'Verdrahtung'
THEN [PlanAufwand]
END ) AS Verdrahtung
FROM #yourtable ta
GROUP BY Auftrag
Через сводный запрос:
SELECT Auftrag, Konstruktion, Mechanik, Verdrahtung
FROM #yourtable
PIVOT
(
MAX(PlanAufwand) -- может, тут должно быть SUM() ?
FOR Abteilung IN (Konstruktion, Mechanik, Verdrahtung)
) AS PivotTable;
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=48c33fcbf9fb3a9f8e21eca72b27ff67
Автор решения: Skate_banana
→ Ссылка
Использован Dynamic SQL, для того чтобы каждый раз, когда в таблице изменится содержимое, не переписывать PIVOT.
drop table if exists #Table1
create table #Table1
(
AuftragID bigint not null,
Abteilung nvarchar(200) not null,
PlanAufwand int
);
insert into #Table1 (AuftragID, Abteilung, PlanAufwand)
values
(22103776, 'bestuck', null),
(22103776, 'cnc', null),
(22103776, 'diverses', null),
(22103776, 'fastlane', null),
(22103776, 'konstruktion', null),
(22103776, 'mechanic', null),
(22103776, 'qualitajdcnoenvowcv', null),
(22103776, 'verdrahtung', null),
(22103777, 'arbeiten', 2),
(22103777, 'bestuck', 2),
(22103777, 'cnc', 5),
(22103777, 'diverses', null),
(22103777, 'fastlane', null),
(22103777, 'konstruktion', 7),
(22103777, 'mechanic', 7),
(22103777, 'qualitajdcnoenvowcv', 2),
(22103777, 'verdrahtung', 3)
--,(22103778, 'NOVOE_ZNACHENIE', 5),
--(22103776, 'NOVOE_ZNACHENIE', 2), ---при добавлении новых значений в таблицу, они будут автоматом попадать в запрос с PIVOT'ом
--(22103777, 'NOVOE_ZNACHENIE', null)
declare @val1 nvarchar(max);
declare @val nvarchar(max);
declare @company table ([name] nvarchar(max), num int identity (1,1));
declare @select nvarchar(max);
insert into @company ([name])
select distinct Abteilung as [name]
from #Table1;
set @val =
(select stuff((select ',' + [name]
from @company
for xml path('')
), 1, 1, '')
);
set @val1 =
(select stuff((select ', isnull(' + [name] + ', ''0'') as '+ [name]
from @company
for xml path('')
), 1, 1, '')
);
set @select = 'select AuftragID, ' + @val1 +
' from
(
select AuftragID, sum(PlanAufwand) as sumorder, Abteilung as [name]
from #Table1
group by AuftragID, Abteilung
) t
pivot(sum(sumorder)
for [name]
IN (' + @val + ')
) as d';
exec (@select)
