2016-05-27 5 views
0

sagen, dass ich einen Datensatz wie diese:Wie gruppiert man nach einem Feld in Oracle?

MANAGER | USER | NUM1 | NUM2 | NUM3 
---------|--------|--------|--------|------- 
Bob  | Jane | 9  | 88 | 2 
Bob  | Jane | 34 | 32 | 52 
Bob  | Jane | 32 | 111 | 9 
Bob  | Rick | 64 | 1  | 102 
Bob  | Rick | 12 | 41 | 16 
Bob  | Rick | 4  | 13 | 20 
Bob  | Mark | 87 | 1  | 333 
Bob  | Mark | 342 | 41 | 16 
Bob  | Mark | 54 | 813 | 6 

Wie Sie die Anzahl Spalten alle verschieden sehen können, sind die Manager immer das gleiche sind, und der Benutzer wird zu wiederholen.

Ich möchte nach Benutzer gruppieren, so dass nur eine Spalte pro Benutzer angezeigt wird.

Also der letzte Datensatz wird wie folgt aussehen:

MANAGER | USER | NUM1 | NUM2 | NUM3 
---------|--------|--------|--------|------- 
Bob  | Jane | 9  | 88 | 2 
Bob  | Rick | 64 | 1  | 102 
Bob  | Mark | 87 | 1  | 333 

ich so etwas laufen möchte:

SELECT MANAGER, USER, NUM1, NUM2, SUM(NUM3) AS NUM3 
FROM MYTABLE 
GROUP BY USER 

Dieser Code wird nicht funktionieren, da Sie von allen Aggregaten zum Gruppieren Funktionen. Ich möchte keine Aggregatfunktionen für die anderen Spalten verwenden, da sie die Werte für NUM1 und NUM2 ändern. Gibt es einen Weg dazu? Wer weiß, was ich dafür tun kann?

+1

Ihre Beschreibung und Beispieldaten stimmen nicht überein. –

+1

Warum 'sum (num3)'? Ihr endgültiger Datensatz enthält nur eine Zeile aus den ursprünglichen Daten, ohne eine Aggregation, die nicht mit Ihren Angaben übereinstimmt. War "eine Spalte pro Benutzer" "eine Zeile ..."? Wenn du eine Zeile willst, wie wirst du entscheiden, welche? –

+0

GordonLinoff, es war nur ein zufälliges Beispiel. @Alex Poole, Sie haben Recht, wie wird die Entscheidung getroffen, welche zu behalten? Ich versuche, einen Datensatz zu reproduzieren, den jemand anders gemacht hat, aber mit einer anderen Tabelle mit verschiedenen Feldern. Mit dieser Tabelle bekomme ich diese unerwünschten Ergebnisse. Aber ich habe meine Abfrage in SSRS gestellt, die die Gruppierung durchführen kann, und sie hat nur die erste Zeile ausgewählt, was nicht korrekt ist. Also nicht sicher was ich machen soll. – Zolt

Antwort

2

Eine mögliche Lösung, wenn Sie die Summe über Spalte NUM3 erhalten müssen. Verwenden Sie die analytische Version (Fensterfunktion) von SUM. Das neben ROW_NUMBER. Dies ermöglicht Ihnen, zu definieren, was die erste Zeile pro Gruppe ist und nach wie vor die Gesamtsumme für die Gruppe auswählen:

SELECT MANAGER, USER, NUM1, NUM2, NUM3 
FROM 
    (SELECT 
     MANAGER, USER, NUM1, NUM2, 
     ROW_NUMBER() over (partition by MANAGER, USER /* order by ....*/) AS USERROWNUMBER, 
     SUM(NUM3) over (partition by MANAGER, USER) AS NUM3 
    FROM MYTABLE) 
WHERE 
    USERROWNUMBER = 1 

Es wäre von schön, eine order by-Klausel in der ROW_NUMBER Fensterfunktion angeben, sonst Oracle beliebige Reihenfolge auswählen kann und könnte sogar die Zeilen in einer anderen Reihenfolge zu einer anderen Gelegenheit zurückgeben. Das Sortieren nach einer ID oder beispielsweise nach NUM1 wäre hilfreich, um konsistentere Ergebnisse zu erhalten.

Wenn Sie NUM3 schließlich nicht zusammenfassen müssen, können Sie einfach NUM1 und NUM2 auswählen und den gesamten SUM-Ausdruck beibehalten.

Verwandte Themen