在SQL Server中将垂直表转换为水平表

时间:2018-10-18 13:44:00

标签: sql-server sql-server-2012

我有一个大表,它有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');

我正在尝试获取如下所示的水平表(每个ID以及损失和承运人的水平结构):

horizontalstructure

我在尝试使用end语句的情况下,但没有达到预期的结果。

有人可以帮忙吗?我很感激。

1 个答案:

答案 0 :(得分:4)

已被问及回答了数百次。但是,编写解决方案比将您指向重复的解决方案要容易得多。出色的职位发布表结构,示例数据和所需的输出!!!

最简单的解决方案是使用这样的条件聚合。

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