Nach Itzik Ben-Gan in Inside Microsoft SQL Server 2008: T-SQL Querying, geht SQL Server durch drei Schritte, wenn eine Tabelle unpivoting:
- generieren Kopien
- Extract Elemente
- entfernen Reihen mit NULLs
Schritt 1: Kopien erstellen
Eine virtuelle Tabelle wird erstellt, die eine Kopie jeder Zeile in der ORIGNAL-Tabelle für jede Spalte enthält, die aufgehoben wird. Außerdem wird eine Zeichenkette des Spaltennamens in einer neuen Spalte gespeichert (nennen Sie dies die Spalte QuestionName). * Hinweis: Ich habe den Wert in einer Ihrer Spalten auf NULL geändert, um den vollständigen Prozess anzuzeigen.
UserID UserName AnswerTo1 AnswerToQ2 AnswerToQ3 QuestionName
1 John 1 0 1 AnswerToQuestion1
1 John 1 0 1 AnswerToQuestion2
1 John 1 0 1 AnswerToQuestion3
2 Mary 1 NULL 1 AnswerToQuestion1
2 Mary 1 NULL 1 AnswerToQuestion2
2 Mary 1 NULL 1 AnswerToQuestion3
Schritt 2: Extract Elemente
Dann ist eine weitere Tabelle erstellt, die für jeden Wert aus der Quellenspalte, die der Zeichenkette Wert entspricht in der Spalte QuestionName eine neue Zeile erzeugt. Der Wert wird in einer neuen Spalte gespeichert (rufen Sie die Spalte Antwort auf).
UserID UserName QuestionName Response
1 John AnswerToQuestion1 1
1 John AnswerToQuestion2 0
1 John AnswerToQuestion3 1
2 Mary AnswerToQuestion1 1
2 Mary AnswerToQuestion2 NULL
2 Mary AnswerToQuestion3 1
Schritt 3: Entfernen Reihen mit NULLS
Dieser Schritt alle Zeilen herausfiltert, die mit Nullwerten in der Spalte Response erstellt wurden. Mit anderen Worten, Wenn eine der AnswerToQuestion-Spalten einen Nullwert hatte, wurde sie nicht als eine nicht gespielte Zeile dargestellt.
UserID UserName QuestionName Response
1 John AnswerToQuestion1 1
1 John AnswerToQuestion2 0
1 John AnswerToQuestion3 1
2 Mary AnswerToQuestion1 1
2 Mary AnswerToQuestion3 1
Wenn Sie diese Schritte ausgeführt haben, können Sie
- CROSS JOIN alle Zeilen in der Tabelle gegen jede AnswerToQuestion Spaltenname Zeile kopiert
- Füllen Sie die Spalte Response basierend auf der passenden bekommen die Quellenspalte und QuestionName
- Entfernen Sie die NULL, um die gleichen Ergebnisse ohne Verwendung von UNPIVOT zu erhalten.
Ein Beispiel unter:
DECLARE @t1 TABLE (UserID INT, UserName VARCHAR(10), AnswerToQuestion1 INT,
AnswertoQuestion2 INT, AnswerToQuestion3 INT
)
INSERT @t1 SELECT 1, 'John', 1, 0, 1 UNION ALL SELECT 2, 'Mary', 1, NULL, 1
SELECT
UserID,
UserName,
QuestionName,
Response
FROM (
SELECT
UserID,
UserName,
QuestionName,
CASE QuestionName
WHEN 'AnswerToQuestion1' THEN AnswerToQuestion1
WHEN 'AnswerToQuestion2' THEN AnswertoQuestion2
ELSE AnswerToQuestion3
END AS Response
FROM @t1 t1
CROSS JOIN (
SELECT 'AnswerToQuestion1' AS QuestionName
UNION ALL SELECT 'AnswerToQuestion2'
UNION ALL SELECT 'AnswerToQuestion3'
) t2
) t3
WHERE Response IS NOT NULL
Ich bekomme 'Spalte Fragewort existiert nicht' mit diesem – hedgedandlevered
Nein, meine Abfrage funktioniert gut. Sie erhalten diesen Fehler nur, wenn Sie versuchen, in der Abfrage auf den Alias 'QuestionName' zu verweisen. Fügen Sie diese Abfrage in eine abgeleitete Tabelle ein und wählen Sie sie aus. Sie können dann Bedingungen hinzufügen. Sie verwenden SQL Server, richtig? – ErikE
Oh nein, ich benutze reguläres SQL. Das sql-server-Tag wurde nicht angezeigt. Danke, am Ende herauszufinden, mit 8kb Antwort und Ihre. – hedgedandlevered