Ich weiß, dass viele von euch dieses Verhalten beobachtet haben, aber ich frage mich, ob irgendjemand erklären kann, warum. Wenn ich eine kleine Tabelle erstelle, um ein Beispiel für die Verwendung der Pivot-Funktion zu erstellen, bekomme ich die Ergebnisse, die ich erwarten würde:
%Vor%Hier ist die Pivot-Abfrage:
%Vor%Hier sind die Ergebnisse:
Wenn ich jedoch die Tabelle mit einer Identitätsspalte erstelle, werden die Ergebnisse in separate Zeilen aufgeteilt:
%Vor%Genaue Abfrage:
%Vor%Unterschiedliche Ergebnisse:
Es scheint mir, dass die ID-Spalte in der Abfrage verwendet wird, obwohl sie in der Abfrage überhaupt nicht erscheint. Es ist fast so, als wäre es implizit in der Abfrage enthalten, aber nicht in der Ergebnismenge.
Kann jemand erklären, warum dies geschieht?
Das passiert, weil die Spalte ID
für jede Zeile eindeutig ist und da Sie die Tabelle direkt (ohne Unterabfrage) abfragen, wird diese Spalte als Teil von GROUP BY
in die Aggregatfunktion einbezogen.
Die Dokumentation enthält die MSDN-Dokumentation zu FROM
Folgendes angeben:
table_source PIVOT <pivot_clause>
Gibt an, dass die Quelle "table_source" basierend auf der Spalte "pivot_column" gedreht wird. table_source ist ein Tabellen- oder Tabellenausdruck. Die Ausgabe ist eine Tabelle, die alle Spalten der table_source außer pivot_column und value_column enthält. Die Spalten der table_source, mit Ausnahme von pivot_column und value_column , heißen die Gruppierungsspalten des Pivot-Operators.
PIVOT
führt eine Gruppierungsoperation für die Eingabetabelle in Bezug auf die Gruppierungsspalten durch und gibt eine Zeile für jede Gruppe zurück. Darüber hinaus enthält die Ausgabe eine Spalte für jeden in der column_list angegebenen Wert, der in der pivot_column der input_table angezeigt wird.
Ihre Version sagt grundsätzlich SELECT * FROM yourtable
und PIVOT diese Daten. Obwohl die Spalte ID
nicht in Ihrer endgültigen SELECT-Liste enthalten ist, handelt es sich um ein Gruppierungselement in der Abfrage. Wenn Sie den PIVOT mit einem "Pre-PIVOT" -Beispiel vergleichen, sehen Sie, was Ihre Version ist. In diesem Beispiel wird ein CASE-Ausdruck und eine Aggregatfunktion verwendet:
Das Ergebnis wird verzerrt sein, auch wenn Sie in der endgültigen Liste nicht ID
haben, wird es immer noch zum Gruppieren verwendet, und da sie eindeutig sind, erhalten Sie mehrere Zeilen.
Der einfachste Weg, dies bei der Verwendung von PIVOT zu lösen, ist die Verwendung einer Unterabfrage:
%Vor% In dieser Version geben Sie nur die Spalten zurück, die Sie tatsächlich benötigen und von Ihrer Tabelle benötigen. Dies schließt ID
aus, so dass Sie Ihre Daten nicht gruppieren können.
Tags und Links sql sql-server tsql pivot