通过多对多 table 将行转换为列

Turning rows into columns over a many-to-many table

所以我有三个表:

学生:

StuID
------
1
2

斯图康:

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 个用于联系人)

我很确定这里可以应用一个枢轴,但我不知道该怎么做。

这是动态执行此操作的一种方法:

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);

注意:它可能应该是联系人上的正常 JOIN 而不是 LEFT JOIN,但它是左连接以防万一 table 之间存在一些不一致。 Students table 没有加入,因为没有必要。