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 Server - Pivot 将行转换为列(带有额外的行数据)