Преобразование вертикальной таблицы в горизонтальную в SQL Server - PullRequest
0 голосов
/ 18 октября 2018

У меня есть большая таблица с 8 номерами строк с соответствующими потерями и носителем.Я пытаюсь преобразовать в горизонтальную структуру.

CREATE TABLE #mytable
(
[ID] int NULL,
[RowNum] bigint NULL,
[Loss] float NULL,
[Carrier] nvarchar(255) NULL
)

INSERT INTO #mytable ([ID], [RowNum], [Loss], [Carrier])
VALUES (1,1, 0, 'test1'),
       (1,2, NULL,  'test2'),
       (1,3, 1.95, 'test3'),
       (1,4, 51, 'test4'),
       (1,5, 105.75, 'test5'),
       (1,6, 0, 'test6'),
       (1,7, 173, 'test7'),
       (1,8, 256.35, 'test8'),
       (2,1, 33158.3, 'test1'),
       (2,2, 7925396, 'test2'),
       (2,3, 0, 'test3'),
       (2,4, NULL, 'test4'),
       (2,5, 2461684, 'test5'),
       (2,6, 159392, 'test6'),
       (2,7, 14791, 'test7'),
       (2,8, 14555, 'test8');

Я пытаюсь получить горизонтальную таблицу, подобную следующей (для идентификатора и горизонтальной структуры для потерь и несущих):

horizontalstructure

Я пытался завершить утверждение, но не достиг желаемых результатов.

Может кто-нибудь помочь?Я ценю его.

1 Ответ

0 голосов
/ 18 октября 2018

Об этом спрашивали и отвечали сотни раз.Но было проще написать решение, чем указать на дубликат.Отличная структура таблицы размещения заданий, примерные данные и желаемый результат !!!

Самое простое решение - использовать условную агрегацию, подобную этой.

select ID
    , Loss1 = max(case when RowNum = 1 then Loss end)
    , Loss2 = max(case when RowNum = 2 then Loss end)
    , Loss3 = max(case when RowNum = 3 then Loss end)
    , Loss4 = max(case when RowNum = 4 then Loss end)
    , Loss5 = max(case when RowNum = 5 then Loss end)
    , Loss6 = max(case when RowNum = 6 then Loss end)
    , Loss7 = max(case when RowNum = 7 then Loss end)
    , Loss8 = max(case when RowNum = 8 then Loss end)
    , Carrier1 = max(case when RowNum = 1 then Carrier end)
    , Carrier2 = max(case when RowNum = 2 then Carrier end)
    , Carrier3 = max(case when RowNum = 3 then Carrier end)
    , Carrier4 = max(case when RowNum = 4 then Carrier end)
    , Carrier5 = max(case when RowNum = 5 then Carrier end)
    , Carrier6 = max(case when RowNum = 6 then Carrier end)
    , Carrier7 = max(case when RowNum = 7 then Carrier end)
    , Carrier8 = max(case when RowNum = 8 then Carrier end)
from #mytable
group by ID
...