Zum Zwecke der Diskussion, lassen Sie uns ein Beispieldatensatz in einer Tabelle SubjectUser wie folgt genannt definieren:
;WITH
orderedSubjects AS (
SELECT
UserId
, SubjectId
, 'SubjectId'
+ CAST(
ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY SubjectId)
AS NVARCHAR)
AS col
FROM SubjectUser
)
SELECT *
FROM orderedSubjects
PIVOT (
MAX(SubjectId)
FOR col IN (SubjectId1, SubjectId2, SubjectId3)
) AS p
:
SELECT NULL AS SubjectId, NULL AS UserID INTO SubjectUser WHERE 1=0
UNION SELECT 'cpsc500', 'maxt3r'
UNION SELECT 'phil507', 'zontar33'
UNION SELECT 'phil507', 'maxt3r'
UNION SELECT 'eng501', 'zontar33'
UNION SELECT 'eng501', 'maxt3r'
UNION SELECT 'bkwv101', 'spaced99'
Sie dann kann das gewünschte Ergebnis mit dieser Abfrage erhalten
Schauen wir uns diese Abfrage in Teilen an. Das erste Problem besteht darin, den Fächern jedes Benutzers Spaltennamen zuzuweisen. Die orderedSubjects Tabelle dient diesem Zweck, durch diese Abfrage definiert:
SELECT
UserId
, SubjectId
, 'SubjectId'
+ CAST(
ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY SubjectId)
AS NVARCHAR)
AS col
FROM SubjectUser
ROW_NUMBER() ... PARTITION BY ... ORDER BY verwendet, um eine Sequenznummer zu jedem Benutzer-Subjekten zugeordnet werden. Beliebig sind die Themen alphabetisch geordnet. Dann wird ein Spaltenname erzeugt, indem jeder Sequenznummer der String SubjectId vorangestellt wird. Das Ergebnis ist wie folgt:
UserId SubjectId col
maxt3r cpsc500 SubjectId1
maxt3r eng501 SubjectId2
maxt3r phil507 SubjectId3
spaced99 bkwv101 SubjectId1
zontar33 eng501 SubjectId1
zontar33 phil507 SubjectId2
Wir haben jetzt die Daten, die wir benötigen, um das Endergebnis zu erstellen. Es wird durch Verschwenken orderedSubjects erhalten:
SELECT *
FROM orderedSubjects
PIVOT (
MAX(SubjectId)
FOR col IN (SubjectId1, SubjectId2, SubjectId3)
) AS p
Die Anwendung der MAX ist nur erforderlich, weil die pivot Syntax die Verwendung einer Aggregationsfunktion erfordert. In dem vorliegenden Fall gibt es nur eine SubjectID in jeder Gruppe, so dass MAX ebenso einfach MIN sein könnte.
Beachten Sie auch, dass die SQL Server PIVOT Syntax erfordert, dass die Menge der generierten Pivot-Spalten in Anzahl festgelegt werden. In diesem Fall ist die Abfrage für drei Themen fest codiert. Wenn die Daten mehr Werte enthalten, als in die zugewiesene Anzahl von Spalten passen, wird der Überschuss verworfen.
Das Endergebnis ist wie folgt:
UserId SubjectId1 SubjectId2 SubjectId3
maxt3r cpsc500 eng501 phil507
spaced99 bkwv101 NULL NULL
zontar33 eng501 phil507 NULL
@ p.campbell, ich vermute, dass er mit seinem ersten Satz tat .. –