SQL Server试图将数据从行转换为列

Posted

技术标签:

【中文标题】SQL Server试图将数据从行转换为列【英文标题】:SQL Server Trying to convert the data from rows to columns 【发布时间】:2021-02-10 14:28:56 【问题描述】:

我有如下数据表

Crosswalk_id Code
ORG_201      1234
ORG_201      3456
ORG_201      3459
ORG_201      0983
ORG_201      2562
ORG_201      1239

需要转换成

Crosswalk_id   C1    C2   C3    C4    C5    C6
ORG_201       1234  3456  3459  0983  2562  1239

请帮助我使用 pivot 实现这一目标

【问题讨论】:

如果你下次有七行,然后呢? Pivot 只能生成固定数量的列,除非您开始使用动态 sql - 即便如此,您也需要事先知道您需要多少列。 什么也决定了数据的顺序?为什么首先是'1234' 而不是'0983''1239' @Arvo 我总是说,当有人想要行号透视时,您想要的最大列数必须有一些限制。即使 Excel 也有限制。所以你可以转动你想要的最大值。 @Charlieface 就像他们说的,640K 应该对任何人都足够了;) @Arvo 16384 但我想知道谁能看到这么多 【参考方案1】:

row_number()使用条件聚合:

select crosswalk_id,
       max(case when seqnum = 1 then code end) as c1,
       max(case when seqnum = 2 then code end) as c2,
       max(case when seqnum = 3 then code end) as c3,
       max(case when seqnum = 4 then code end) as c4,
       max(case when seqnum = 5 then code end) as c5,
       max(case when seqnum = 6 then code end) as c6
from (select t.*,
             row_number() over (partition by crosswalk_id order by (select null)) as seqnum
      from t
     ) t
group by crosswalk_id;

【讨论】:

【参考方案2】:

您可以使用 SQL Server PIVOT 函数,它正是为此目的而设计的,即将行转换为列。

此博客上的example of the PIVOT Function is available here。

你必须包含一个聚合子句,如果你没有重复的行,MAX() 可以很好地处理字符串值。

有关完整文档,请查看official Microsoft doc covering PIVOT and UNPIVOT 函数。

注意:在您的示例中,您只有一个值“ORG_201”,您可能需要更多使用该功能。您需要根据 [Code] 列中的预期值来命名列。

【讨论】:

【参考方案3】:

你的 ID 不需要不同吗???

   -- DROP TABLE mytable

CREATE table mytable (
    id NVARCHAR(20),
    code NVARCHAR(5)
)
GO

INSERT INTO mytable ( id, code ) VALUES ( 'ORG_201', '1234')
INSERT INTO mytable ( id, code ) VALUES ( 'ORG_202', '3456')
INSERT INTO mytable ( id, code ) VALUES ( 'ORG_203', '3459')
INSERT INTO mytable ( id, code ) VALUES ( 'ORG_204', '0983')
INSERT INTO mytable ( id, code ) VALUES ( 'ORG_205', '2562')
INSERT INTO mytable ( id, code ) VALUES ( 'ORG_206', '1239')

SELECT      *
FROM     mytable

select * from
(

    SELECT id, code
    FROM mytable
) t
PIVOT (
    max(code)
    FOR id  IN ([ORG_201],[ORG_202],[ORG_203],[ORG_204],[ORG_205],[ORG_206])
) AS PivotTable;

【讨论】:

以上是关于SQL Server试图将数据从行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

pig - 将数据从行转换为列,同时为特定行中不存在的字段插入占位符

使用带有子查询的最大查询将SQL / PL行转换为列

SQL Server - Pivot 将行转换为列(带有额外的行数据)

SQL Server 将行数据转换为列标题

如何在没有标题列的情况下将 Pentaho Kettle 中的表格从行转换为列

如何在 SQL Server 中将行动态转换为列