2017-07-06 5 views
-2

Ich habe diese Abfrage von jemand anderem geschrieben und ich versuche herauszufinden, wie es funktioniert. Ich habe eine allgemeine Idee über all diese Dinge wie row_number(), partition by, pivot, aber ich bin nicht in der Lage, sie alle zusammen zu verstehen.Oracle 'Partition By' und 'Row_Number' Schlüsselwort zusammen mit Pivot

Für diese Abfrage:

enter image description here

Dieses es die Ausgabe von der Abfrage erzeugt, die gemäß der richtige ist:

select 
    d, p, s, a 
from 
(
    select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name)) as rownumber from occupations 
) 
pivot 
(
    max(name) 
    for occupation 
    in ('Doctor' as d, 'Professor' as p, 'Singer' as s, 'Actor' as a) 
) 
order by rownumber; 

Dies ist die Eingabetabelle die obige Abfrage funktioniert, auf dem Frage:

Jenny Ashley  Meera Jane 
Samantha Christeen Priya Julia 
NULL  Ketty  NULL Maria 

Jetzt möchte ich k nun, wie die Ausgabe durch die Abfrage erzeugt wird, d.h. Schritt für Schritt mit Ablauf der Ausführung. Eine Erklärung mit einfachen Beispielen, die der obigen Situation entsprechen, würde sehr geschätzt werden. Danke im Voraus.

+0

Wer auch immer downvoted, bitte erwähnen Sie den Grund –

Antwort

0

Nach from Klausel Sie haben folgende:

select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name))

Above praktisch Tabellendaten in drei Spalten umschichten - Name, Beruf, rownumber. Die Zimmernummer wird zurückgesetzt, sobald sich die Belegungsspalte ändert. Die Ausgangsdaten werden wie:

NAME     OCCUPATION   ROWNUMBER 
-------------------- -------------------- ---------- 
Jane     ACTOR    1 
Julia    ACTOR    2 
Maria    ACTOR    3 
JENNY    DOCTOR    1 <-- rownumber reset to 1 
Sammantha   DOCTOR    2 

Pivot-Funktion lassen Aggregat Sie Ergebnis & Zeilen in Spalten drehen. Pivot Verwendungscode ist:

PIVOT 
(
    aggregate_function(column2) 
    FOR column2 
    IN (expr1, expr2, ... expr_n) | subquery 
) 

So Ihre PIVOT Funktionsnamen NAME basierend auf OCCUPATION gestapelt haben. Jeder Stapel (Spalte in der Ausgabe) wird nach rownumber column sortiert, der über die erste Unterabfrage eingefügt wird.

+0

Vielen Dank für Ihre Zeit, aber ich selbst weiß so viel, was ich will ist, wie jedes Mal Pivot mit partitionierten Zeilen arbeitet. Wie ist der SQL-Flow? Was wird zuerst ausgeführt und was folgt? Es wäre schön, wenn Sie mir in detaillierten Schritten erklären könnten, wie die Antwort kommt. –

+0

@ShivamArora - die Reihenfolge der Ausführung ist genau so, wie Abhishek es beschrieben hat. Sie haben eine Unterabfrage, so dass diese zuerst ausgeführt wird. Das Ergebnis ist die "Ausgabe" wie in dieser Antwort beschrieben: drei Spalten (Name, Beruf, Hausnummer). Diese Ausgabe wird zur Eingabe der PIVOT-Operation - und WIE diese drei Spalten in der Unterabfrage erstellt wurden, wird irrelevant (und die PIVOT-Operation weiß es nicht, hat keine Möglichkeit zu wissen und muss nicht wissen, dass die dritte Spalte erstellt wurde) mit der ROW_NUMBER-Funktion). – mathguy

+0

@mathguy: wenn ich die '(ROW_NUMBER() OVER (Partition nach Besetzungsreihenfolge nach Name)) als 'rownumber' aus der Abfrage entfernen, was wäre die Antwort für Sie? –

Verwandte Themen