2016-06-30 68 views
0

所以我有三個表:談到行轉換成列在許多一對多表

學生:

StuID 
------ 
1 
2 

StuCon:

StuConId StuID ConID StuConType Priority 
---------------------------------------------- 
1   1  1  Parent  1 
2   1  2  Guardian 2 
3   2  3  Parent  1 

聯繫人:

ConID ConName ConPhn 
---------------------- 
1  John 5555555 
2  Sally 4444444 
3  Dana 3333333 

我試圖得到看起來像這樣的結果:

StuID ConID1 StuConType1 ConName1 ConPhone1 ConID2 StuConType2 ConName2 ConPhone2 
---------------------------------------------------------------------------------------- 
1  1  Parent  John  5555555  2  Guardian  Sally  4444444 
2  3  Parent  Dana  3333333  Null Null   Null  Null 

到目前爲止,我自己看着辦做到這一點的唯一方法是通過使左很多連接(有些學生有多達10個觸點所以這是10左右加入了stucon和10個聯繫人)

我很確定這裏可以應用一個關鍵點,我只是不知道該怎麼做。

+1

谷歌Dynamic Pivot .......... –

+1

我不認爲你需要一個PIVOT在這裏。只需加入優先級爲1的第一個聯繫人組,並在優先級爲2的第二個聯繫人組中加入左側加入。 – DVT

回答

2

這裏的動態有一個辦法:

DECLARE @selects VARCHAR(MAX) = '', @SQL VARCHAR(MAX) = ''; 
SELECT @selects += ' 
    , MAX(CASE WHEN SC.[Priority] = ' + CAST([Priority] AS VARCHAR(255)) + ' THEN C.ConID END) [ConID' + CAST([Priority] AS VARCHAR(255)) + '] 
    , MAX(CASE WHEN SC.[Priority] = ' + CAST([Priority] AS VARCHAR(255)) + ' THEN SC.StuConType END) [StuConType' + CAST([Priority] AS VARCHAR(255)) + '] 
    , MAX(CASE WHEN SC.[Priority] = ' + CAST([Priority] AS VARCHAR(255)) + ' THEN C.ConName END) [ConName' + CAST([Priority] AS VARCHAR(255)) + '] 
    , MAX(CASE WHEN SC.[Priority] = ' + CAST([Priority] AS VARCHAR(255)) + ' THEN C.ConPhn END) [ConPhone' + CAST([Priority] AS VARCHAR(255)) + ']' 
FROM StuCon 
GROUP BY [Priority] 
ORDER BY [Priority]; 

SET @SQL = 'SELECT StuID' + @selects + ' FROM StuCon SC LEFT JOIN Contacts C ON C.ConID = SC.ConID GROUP BY StuID;'; 
EXEC(@SQL); 

注意:它可能應該是在接觸,而不是LEFT JOIN正常JOIN,但它是一個左連接這裏,以防萬一有表之間存在一些矛盾。 Students表尚未加入,因爲這不是必需的。

+0

此處不需要動態SQL。 – shawnt00

+0

@ shawnt00你不需要這麼做,但是考慮到任何學生最多可以有十個聯繫人(並且假設這不是限制),這比爲十個聯繫人寫幾行代碼更容易(並且假定這是最大的)... – ZLK

+0

我忽略了10個聯繫人的提及。雖然這種方法有一定的經濟性,但動態SQL有很多缺點,結果中的列數突然改變。 – shawnt00