【问题标题】:SQL Server - Multiple rows to columns by unique identifierSQL Server - 按唯一标识符多行到列
【发布时间】:2017-01-18 15:08:19
【问题描述】:

我有以下数据库表:

|  Article   |   Material  |
|------------|-------------|
| article001 | material001 |
| article001 | material002 |
| article002 | material002 |
| article002 | material003 |
| article002 | material004 |
| article003 | material002 |
| article004 | material003 |
| article004 | material004 |
| article004 | material005 |
| article004 | material006 |

我想达到这样的结果:

|  Article   |  Material1  |  Material2  |  Material3  |  Material4  |
|------------|-------------|-------------|-------------|-------------|
| article001 | material001 | material002 |             |             |
| article002 | material002 | material003 | material004 |             |
| article003 | material002 |             |             |             |
| article004 | material003 | material004 | material005 | material006 |

我已经尝试过各种可能性(Pivot、CTE、临时表)。不幸的是,我不明白。我对 SQL 很陌生。

【问题讨论】:

标签: sql-server multiple-columns rows


【解决方案1】:

一个简单的解决方案是条件聚合(如果您有最大数量的材料)。如果您需要动态,请告诉我。

Select Article
      ,Material1 = max(case when RN=1 then Material else '' end)
      ,Material2 = max(case when RN=2 then Material else '' end)
      ,Material3 = max(case when RN=3 then Material else '' end)
      ,Material4 = max(case when RN=4 then Material else '' end)
 From (
        Select *
              ,RN = Row_Number() over (Partition By Article Order by Material)
         From  YourTable
      ) A
 Group By Article

返回

编辑 - 动态轴

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName('Material'+cast(RN as varchar(25))) From (Select Distinct RN = Row_Number() over (Partition By Article Order by Material) From Yourtable) A  Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
Select [Article],' + @SQL + '
From (
        Select Article,Material
              ,Item = ''Material''+cast(Row_Number() over (Partition By Article Order by Material) as varchar(25))
         From  YourTable
     ) A
 Pivot (max(Material) For [Item] in (' + @SQL + ') ) p'
Exec(@SQL);

【讨论】:

  • 我没有最大数量的材料。动态解决方案会很棒。
  • @Hellenbeck 给我一点时间
  • 我正在使用 SQL Server 2008 R2。不幸的是没有 concat 函数。
  • @Hellenbeck 2008 年更新。请务必在您以后的问题中指定/标记 2008,否则我们假设当前支持 2012+(未扩展)
  • 非常感谢。这解决了我的问题。将来我将使用 2008 标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多