2016-06-30 13 views
0

Also ich habe drei Tabellen:Drehen Zeilen in Spalten über eine many-to-many-Tabelle

Studenten:

StuID 
------ 
1 
2 

StuCon:

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

Kontakte:

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

Ich versuche, Ergebnisse zu erhalten, die wie folgt aussehen:

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 

Bisher ist die einzige Art, wie ich herausfinden kann, das zu tun ist durch eine Menge von links machen verbindet (einige Studenten haben bis zu 10 Kontakte, so dass ist 10 links für stucon und 10 weitere für Kontakte verbindet)

Ich bin mir ziemlich sicher, dass es einen Drehpunkt gibt, der hier angewendet werden kann, ich kann einfach nicht herausfinden, wie es geht.

+1

Google Dynamic Pivot .......... –

+1

Ich glaube nicht, dass Sie hier einen PIVOT brauchen. Nur ein Join auf der ersten Kontaktgruppe, wo die Priorität 1 ist, und eine linke Verbindung auf der zweiten Kontaktgruppe, wo die Priorität 2 ist. – DVT

Antwort

2

Hier ist ein Weg, dies dynamisch zu tun:

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

Weitere Informationen: Es wohl eher ein normaler JOIN auf Kontakte sein sollte als ein LEFT JOIN, aber es ist ein LEFT JOIN hier nur für den Fall gibt es einige Unstimmigkeiten zwischen Tabellen. Die Tabelle Students wurde nicht verknüpft, da dies nicht erforderlich ist.

+0

Sie brauchen hier keine dynamische SQL. – shawnt00

+0

@ shawnt00 Sie brauchen es nicht, aber da jeder Student bis zu zehn Kontakte haben kann (und davon ausgehen, dass dies nicht das Limit ist), ist dies einfacher als das Schreiben mehrerer Zeilen für zehn Kontakte (und vorausgesetzt, das ist das Maximum)) ... – ZLK

+0

Ich habe die Erwähnung von 10 Kontakten übersehen. Während es bei dieser Methode eine gewisse Wirtschaftlichkeit gibt, hat dynamic sql viele Nachteile, ebenso wie sich die Anzahl der Spalten in den Ergebnissen plötzlich ändert. – shawnt00