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)
→ Ссылка