SQL 将不同的行转换为一行和多列

Posted

技术标签:

【中文标题】SQL 将不同的行转换为一行和多列【英文标题】:SQL transform distinct rows into one row and multiple columns 【发布时间】:2021-04-10 15:01:37 【问题描述】:

我有一个表和具有相同Name 的行最多可以出现 5 次。示例:

| Name   | Value   |
|--------|---------|
| Test   | Value1  |
| Test   | Value2  |
| Test   | Value3  |
| FooBar | Value11 |
| FooBar | Value12 | 

我正在尝试创建一个查询来压缩行以具有唯一的 Name 并将值传输到列。如果每个名称的值少于 5 个,则其余列应为 NULL。

| Name   | Col1    | Col2    | Col3   | Col4 | Col5 |
|--------|---------|---------|--------|------|------|
| Test   | Value1  | Value2  | Value3 | NULL | NULL |
| FooBar | Value11 | Value12 | NULL   | NULL | NULL |

我查看了Pivot,但没有要汇总的列。 我需要这种格式的 csv 文件。 使用 SQL Server 2016。

【问题讨论】:

【参考方案1】:

您可以使用row_number() 构造一列:

select name,
       max(case when seqnum = 1 then value end) as value_1,
       max(case when seqnum = 2 then value end) as value_2,
       max(case when seqnum = 3 then value end) as value_3,
       max(case when seqnum = 4 then value end) as value_4,
       max(case when seqnum = 5 then value end) as value_5
from (select t.*,
             row_number() over (partition by name order by value) as seqnum
      from t
     ) t
group by name;

【讨论】:

以上是关于SQL 将不同的行转换为一行和多列的主要内容,如果未能解决你的问题,请参考以下文章

sql中一对多关系的查询结果的多行转换成一行多列

如果一列不为空,则转换为多列的行

SQL根据一列中的最大值从多列中选择不同的行

SQL 多行多列数据清洗合并为一行

Big Query (SQL) 将多列转换为行/数组

SQL 查询返回填充了最多列的行