【问题标题】:How to convert table columns to rows [duplicate]如何将表列转换为行[重复]
【发布时间】:2017-05-09 14:40:13
【问题描述】:

我有一张如下表:

+-----------+------------+--------+
| Col1 | Col2 | Col3 |
+-----------+------------+--------+
| 12345678 |名字 |约翰 |
| 12345678 |姓氏 |史密斯 |
| 987456321 |姓氏 |克兰西 |
| 987456321 |中间名 | T |
| 987456321 |身高 | 176cm |
| 654125878 |名字 |谭 |
| 654125878 |重量 | 150磅 |
+-----------+------------+--------+

如何将其转换为:

+-----------+------------+------------+---------+- --------+--------+ |身份证 |名字 |中间名 |姓氏 |身高 |重量 | +-----------+------------+------------+---------+- --------+--------+ | 12345678 |约翰 |空 |史密斯 |空 |空 | | 987456321 |空 | T |克兰西 | 176cm |空 | | 654125878 |谭 |空 |空 |空 | 150磅 | +-----------+------------+------------+---------+- --------+--------+

【问题讨论】:

    标签: sql-server linq


    【解决方案1】:

    我认为条件聚合在这里可以解决问题。

    假设你不需要动态

    Select ID = Col1
          ,FirstName   = max(case when Col2='FirstName'   then Col3 else null end)
          ,MiddleName  = max(case when Col2='MiddleName ' then Col3 else null end)
          ,LastName    = max(case when Col2='LastName '   then Col3 else null end)
          ,Height      = max(case when Col2='Height'      then Col3 else null end) 
          ,Weight      = max(case when Col2='Weight'      then Col3 else null end) 
     From YourTable
     Group By Col1
    

    如果你需要动态

    Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Col2]) From Yourtable  Order by 1 For XML Path('')),1,1,'') 
    Select  @SQL = '
    Select [Col1] as ID ,' + @SQL + '
    From   YourTable
     Pivot (max(Col3) For [Col2] in (' + @SQL + ') ) p'
    Exec(@SQL);
    

    如果有帮助,为动态 Pivot 生成的 SQL 如下:

    Select [Col1] as ID ,[FirstName],[Height],[LastName],[MiddleName],[Weight]
    From   YourTable
    Pivot  (max(Col3) For [Col2] in ([FirstName],[Height],[LastName],[MiddleName],[Weight]) ) p
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2013-08-08
      • 2013-10-01
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多