SQL - 将一对多转换为一行

时间:2015-02-09 09:48:05

标签: sql sql-server

我正在寻找SQL Server中的解决方案,以便根据此示例将结果转换为另一种格式。

基本查询结果

ID     Name     Other IDs
-------------------------
1      John     22
2      Joe      r15
2      Joe      12
3      Jim      17
3      Jim      r87

ID      Name     UniqueID      StudentID
----------------------------------------
1       John     22            
2       Joe      12            r15
3       Jim      17            r87

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我怀疑你可以有不同的规则来决定ID是UniqueId还是StudentID。根据您的数据我尝试了这个:

  select [ID],
         [Name],
         max(case isnumeric([Other IDs]) when 1 then [Other IDs] end) UniqueID,
         max(case left([Other IDs],1) when 'r' then [Other IDs] end) StudentID
    from Table1
group by [ID],
         [Name]
order by [ID]

您可以在SQLFiddler

中查看此演示中的结果

答案 1 :(得分:0)

你应该学习一些规范化。

要解决问题请使用Pivot:

;WITH CTE AS
(
  SELECT 
    ID, Name, [Other IDs], row_number() over (partition by ID order by [Other IDs]) rn
  FROM
   (values(1,'John', '22'),(2,'Joe', 'r15'),(2,'Joe','12'),(3,'Jim','17'),(3,'Jim','r87')) 
     x(ID, Name, [Other IDs])
)
SELECT ID, Name, [1] UniqueID, [2] StudentID FROM CTE
PIVOT (max([Other IDs]) FOR [rn] IN ([1], [2])) AS pvt 
ORDER BY ID

结果:

ID  Name  UniqueID  StudentID
1   John  22        NULL
2   Joe   12        r15
3   Jim   17        r87