2015-02-09 72 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