Spalte kategorisieren und in mehreren Spalten anzeigen

britto3141

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich bin neu hier und bräuchte (ich bin Anfänger) zu folgender Aufgabenstellung eure Unterstützung: Gegeben sei eine Tabelle folgender Gestalt:

Name | Status
-----------------
ABC | 1-Alpha
FGH | 4-Epsilon
EFR | 3-Gamma
ZUT | 4-Epsilon
ABC | 2-Beta
ZUT | 5-Phi
ZUT | 6-Zeta
ABC | 8-Omega
EFR | 7-Xi

Die Spalte Status wird wie folgt kategorisiert: Neu = 1-Alpha, 2-Beta, 3-Gamma; Bearbeitung = 4-Epsilon, 5-Phi, 6-Zeta; Abgeschlossen = 7-Xi, 8-Omega

Das Ziel ist es eine Tabelle folgender Gestalt zu erstellen:

Name | Anzahl(Neu) | Anzahl(Bearbeitung) | Anzahl(Abgeschlossen)

gruppiert über Name.

Mir ist bewusst, dass ich beispielsweise die Tabelle

Name| Anzahl(Neu)

wie folgt erhalten:

Code:
SELECT
p.Name,
COUNT(p.Status) AS Neu
FROM tabelle p
WHERE
p.Status IN ('1-Alpha','2-Beta','3-Gamma')
GROUP BY p.Name

Damit kann ich in ähnlicher Weise für die Tabelle

Name | Anzahl(Bearbeitung)

und

Name | Anzahl(Abgeschlossen)

vorgehen. Besser ist es, wenn man das kompakt in einer Tabelle mit mehreren Spalten darstellen kann. Allerdings weiß ich nicht, wie ich mehrere (bearbeitete) Spalten nebeneinander setzen kann.
Kann mir hier jemand helfen?
 
Werbung:
Zwei Möglichkeiten dazu:
1. du kannst immer mit Case When in der Select Clause bestehende Inhalte auswerten und ein (transformiertes) Ergebnis als neue Spalte ausgeben, das kannst Du beliebig oft machen, also beliebig viele Spalten ergänzen. Die Transformation geschieht über den abgefragten Ausgangswert, der uner gewünschten Bedingungen frei zu einem anderen Wert/Typ ausgegeben werden kann. Z.B. 0 oder 1, was bequem gezählt oder summiert werden kann.
2. Dynamischer wäre eine Kategorientabelle, die die Transformation vom Ausgangswert zur Zielkategorie abbildet. Entweder als echte Tabelle oder als View zusammengesetzt (minimalinvasiv, trotzdem leicht änderbar). Diese Datenquelle wird mit ins Select übernommen.

Die beiden Varianten haben einen nicht offensichtlichen, aber gravierenden Unterschied (neben der Dynamik, die Variante 2 bietet)
Das Case erzeugt per se zusätzliche Spalten je Anwendung.
Die Tabelle erzeugt nur eine neue Spalte, halt mit beliebig vielen Inhalten.

Abhängig vom Einsatzzweck kann man das eine oder andere verwenden. Falls die impliziten Kategorien der ursprünglichen Modelllsituation den Trend haben, Teil eines Business Workflows zu werden oder eigentlich bereits sind, würde ich auf jeden Fall V2 nehmen. Geht es eher um "bloßes" Reporting, mit keiner bis wenig Veränderungspotential, dann ruhig V1. (Aber auch ein komplexes Reporting kann unter solchen Lösungen wie V1 leiden, wenn es an vielen Stellen verwendet wird, ständiges Copy/Paste, Nachbau ist dann eine recht zuverlässige Fehlerquelle)
 
Erstmal vielen Dank für die schnelle Antwort :)

zu 1.: Ich habe dann mal heute versucht, dies umzusetzen mit folgendem Ergebnis:

Code:
SELECT
p.Name,
COUNT(CASE WHEN p.Status IN ('1-Alpha','2-Beta','3-Gamma') THEN p.Status END) AS Neu,
COUNT(CASE WHEN p.Status IN ('4-Epsilon','5-Phi','6-Zeta') THEN p.Status END) AS Bearbeitung,
COUNT(CASE WHEN p.Status IN ('7-Xi','8-Omega') THEN p.Status END) AS Abgeschlossen
FROM tabelle p
GROUP BY p.Name
ORDER BY p.Name

Ich denke, dass es passen sollte.

zu 2.: Das habe ich jetzt ehrlicherweise nicht ganz verstanden, wie man eine dynamische Tabelle erzeugt mit einer echten Tabelle oder als View zusammengesetzt. Dennoch hätte ich evtl. den ersterwähnten Code mit UNION ALL verbunden:

Code:
SELECT
p.Name,
COUNT(p.Status)
FROM tabelle p
WHERE
p.Status IN ('1-Alpha','2-Beta','3-Gamma')
GROUP BY p.Name
UNION ALL
SELECT
p.Name,
COUNT(p.Status)
FROM tabelle p
WHERE
p.Status IN ('4-Epsilon','5-Phi','6-Zeta')
GROUP BY p.Name
UNION ALL
SELECT
p.Name,
COUNT(p.Status) AS Neu
FROM tabelle p
WHERE
p.Status IN ('7-Xi','8-Omega')
GROUP BY p.Name

Aber ob das jetzt dynamisch ist, kann ich nicht sagen. Ich denke es eher nicht. Wahrscheinlich war es eher so gedacht, dass man durch beliebige weitere Status die Tabelle flexibel erweitern kann. Wie das allerdings geht, weiß ich jetzt nicht bzw. bräuchte wieder ein paar Hinweise.
 
Werbung:
Gut!
Die Dynamik in V2 entsteht eben nicht mehr durch das Statement, sondern durch das Einbinden einer weiteren, neuen Tabelle. Diese enthält "dynamisch" beliebige Wertepaare (dafür sind Tabellen ja da), die man ganz easy eintippt, natürlich zunächst lediglich die von Dir aufgeführten, aktuell bekannten, benötigten. Wenn dann noch ein "42 Lambda" dazu muss oder "123 Kartoffelbrei", dann ist das 4 Sekunden Tipparbeit. Das Selektstatement bleibt dabei unangetastet und erfordert so auch keine Alter Anweisung, die abhängige Objekte "stören" könnte. (Aber das schluckt Oracle ja meist ganz gut)
Die Viewvariante von V2 macht nichts anderes als die aktuell bekannten Wertepaare per Union aufzuführen und an Stelle der Tabelle im eigentlichen Selectstatement nutzbar zu machen. Schnell gemacht, analog weiterverwendbar durch neue Auswertungsstatements, auch irgendwann ersetzbar durch eine richtige Tabelle gleichen Namens- wenn der View beseitigt wird. Bietet sich auch an, wenn es wirklich nur eine Handvoll Werte sind.
Wie gesagt, mit V2 erhälst Du zunächst nur eine weitere Spalte mit der neuen Kategorie. An der Stelle muss man dann noch weiter machen, wenn es je Kategorie eine Spalte werden soll.
 
Zurück
Oben