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

Sql server 在SQL Server中将垂直表转换为水平表,sql-server,sql-server-2012,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, N

我有一个很大的表,其中有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和一个用于损耗和载波的水平结构):

当结束陈述时,我正在尝试这个案例,但并没有达到预期的结果


有人能帮忙吗?我很感激

这个问题已经被问了几百次了。但编写一个解决方案比指出一个重复的解决方案更容易。优秀的职位发布表结构,样本数据和期望的输出

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

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

但编写解决方案比指向重复的解决方案更容易
。。。有时是真的,在这种情况下可能不是。您可以通过使用
PIVOT
使事情变得有趣。@TimBiegeleisen但是为什么要使用PIVOT呢?不需要,语法迟钝,条件聚合通常性能稍好。不知道PIVOT的性能问题+1。同意它迟钝的语法。@TimBiegeleisen这是Jeff Moden关于这个主题的一篇很好的文章。性能差异非常小,但通过预聚合,它可以显著提升。