2015-02-09 66 views
1

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

基本查询结果

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

希望你的第一个查询已经是多个归表的结果。如果是这样,您可以轻松地编写一个基于这些表而不是第一个查询的新查询。如果不是,那么真正的问题是您的数据库没有正确建模。 – GolezTrol 2015-02-09 09:52:08

+2

很奇怪的问题,到目前为止你试过了什么? – Rocketq 2015-02-09 09:55:04

+2

描述如何选择UniqueID和StudentID。并向我们​​展示您当前的查询! – jarlh 2015-02-09 09:58:39

回答

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

+0

感谢您的解决方案,这看起来像我能够理解的最多。是否可以过滤类型(studentid/employeeid)。 My Orginals db setup看起来像这样: - Person(ID,Name) - PersonIdentifications(PersonID,OtherID,Type)? – 2015-02-09 10:34:35

+0

如果你想过滤掉学生,你可以添加where where条件,如'where left([Other ID],1)<> r'(因为学生ID以'r'开头)。使用你的设置,你可以使用'Type'列来识别这个id并把它们放在右边的列中 – mucio 2015-02-09 10:38:09

0

你应该学习一些正常化。

为了解决这个问题使用数据透视:

;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 
+0

感谢你的解决方案,我已经看到很多关于Pivot的例子,但是我不知道如何在我的例子中使用它。 我可以根据类型(studentid/employeeid)添加条件吗?我的原始设置如下所示: - Person(ID,Name) - PersonIdentifications(PersonID,OtherID,Type) – 2015-02-09 10:33:29