【问题标题】:Convert multiple rows into single row with more columns将多行转换为具有更多列的单行
【发布时间】:2021-07-24 14:34:04
【问题描述】:

我有一个由 id 相关的属性的 SQL Server 表,并且想要进行查询以检查 id 是否具有一组属性。基本上我想进行如下转换,按 Id 分组并为每个唯一属性添加一列:

起始表:

Id Prop Value
1 P1 V1
1 P2 V2
1 P3 V3
2 P1 V4
2 P2 V5
2 P3 V6

结果表:

Id P1 P2 P3
1 V1 V2 V3
2 V4 V5 V6

甚至可以将行值转换为列名吗?我对 SQL 很陌生,并没有设计这个初始表配置。到目前为止,我尝试使用 pivot 和 group by 都没有成功。

【问题讨论】:

  • 如果你事先知道你想要多少列,这是完全可能的。这叫做“转身”。但是,如果您事先不知道列数,您将无法拥有单独的列;不过,您仍然可以将它们连接成一个。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 这能回答你的问题吗? Efficiently convert rows to columns in sql server

标签: sql sql-server tsql


【解决方案1】:

这里有几个选项。

您可能会注意到我在子查询中列出了第 3 列。您需要仅使用所需的列“提供”您的 PIVOT。

要转置的已知列

Select *
 From  (
        Select ID
              ,Prop
              ,Value
         From YourTable
       ) src
 Pivot (max(Value) for Prop in ([P1],[P2],[P3]) ) pvt

Dynamic Pivot 和版本

Declare @SQL varchar(max) = '
Select *
 From (
        Select ID
              ,Prop
              ,Value
         From YourTable
      ) A
 Pivot (max([Value]) For [Prop] in (' + stuff((Select Distinct ','+QuoteName(Prop) 
                                                From  YourTable
                                                Order By 1 
                                                For XML Path('')),1,1,'')  + ') ) p'
Exec(@SQL);

2017 年以上的动态支点

Declare @SQL varchar(max) = '
Select *
 From (
        Select ID
              ,Prop
              ,Value
         From YourTable
      ) A
 Pivot (max([Value]) For [Prop] in (' + (Select string_agg(quotename(Prop),',') 
                                          From (Select distinct Prop From YourTable ) A) + ') ) p'
Exec(@SQL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多