首页 > 解决方案 > SQL 将多行转置到不同的列

问题描述

我有 SQL Server 数据表,如下所示:

ID 症状1 症状2
1 一个
1 C D
2 F
3 一个 C
3 D

我想得到这个:

ID 症状1 症状2 症状 3 症状4
1 一个 C D
2 F
3 一个 C D

这应该是一个“简单”的支点,但我无法弄清楚。如何编写 SQL 查询?

*编辑

对不起,我忽略了一个重要的细节。表中的行数非常大,大约 500.000,因此 ID 非常大。

标签: sqlsql-serverpivot

解决方案


您可以将其作为自连接来执行 - 使用行号来拥有另一列 1 或 2(取决于 ID 出现的次数),应该始终出现 1,有时会出现 2,所以将这些行与 2 连接到那些上具有 1 的行(基于 id)为您提供最终结果..

WITH x AS(
  SELECT
    t.ID,
    t.SYMPTOM1,
    t.SYMPTOM2,
    ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY t.SYMPTOM1) as rn
  FROM t
)

SELECT
  *
FROM
  x x1
  LEFT JOIN x x2 ON x1.id = x2.id AND x1.rn = 1 AND x2.rn = 2

推荐阅读