[db2] Group by

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

och je, ich habe einen schwierigen Fall :(

Ich habe folgende Tabelle:

Code:
Name   Dummy   STATUS      Aktiv
 
Ratna  1       Huebsch      Nein
Ratna  2       Froehlich      Ja
Ratna  3       Huebsch        Ja
Ratna  4       Huebsch        Ja
Ratna  5       Froehlich    Nein

Ich möchte GROUP-BY gegen die Tabelle machen, so dass am Ende folgendes rauskommt:
Code:
Name      STATUS        Gesamt  Aktiv_Anzahl
 
Ratna     Huebsch       3       2 
Ratna     Froehlich     2       1

Für die Spalte "Gesamt" würde ich so machen:
Code:
SELECT Name, STATUS, COUNT(*) AS Gesamt
FROM meinSchema.meineTabelle
GROUP BY Name, STATUS

Hat jemand vielleicht eine Idee, wie ich die Spalte "Aktiv_Anzahl" hinbekomme? Semantisch ist die Spalte eigentlich wie:
Code:
GROUP BY Name, STATUS, Aktiv
, wobei lediglich der Wert "ja" von der Spalte "Aktiv" ge-group-by wird.

Bin ein bisschen ratlos. Vor allen Dingen, es sind ja eigentlich 2 Spalten (Gesamt und Aktiv_Anzahl), die mit Group By erzeugt werden. Und beides in einer einzigen Tabelle.

Danke zusammen.

Schöne Grüße aus Rheinland,

Eure Ratna
 
gem http://www.sk-consulting.de/www/html-data/infodb2/sqlv6ti.htm, http://www.tek-tips.com/viewthread.cfm?qid=1206817 kennt DB2 den CASE-Befehl innerhalb des SELECT. Das macht die Welt einfacher.

Dann kannst du einen SUM() machen und darin den Wert auswerten.
ALso mit CASE den Wert 1 herausgeben wenn aktiv=Ja, ansonten 0. Diese Werte zusammenzählen und fertig
SQL:
SELECT 
    Name, 
    STATUS, 
    COUNT(*) AS Gesamt,
    SUM(CASE WHEN aktiv='Ja' THEN 1 ELSE 0 END) AS Aktiv_Gesamt
FROM meinSchema.meineTabelle
GROUP BY Name, STATUS
 
Zuletzt bearbeitet von einem Moderator:
Hallo zusammen,

vielen lieben Dank, Yaslaw..:D

Vielleicht bist du so nett und mir mit folgendem helfen kannst?

Code:
Name           Rang

Ratna           0
Yaslaw          0
Yaslaw          1
Ratna           1
Yaslaw          2
Ratna           2
Ratna           3

Ich hätte gerne mittels LAST_VALUE folgende Spalte erzeugen:

Code:
Name           Rang    Aktiv

Ratna           0          0
Yaslaw          0          0
Yaslaw          1          0
Ratna           1          0 
Yaslaw          2          1
Ratna           2          0
Ratna           3          1

Also, die Spalte "Aktiv" bekommt den Wert 1 bei dem höchsten Rang für Name. Ich hab LAST_VALUE in Google gefunden. Nur leider weiss ich nicht weiter. Da ist die Rede von ORDER BY, PARTITION und so.. Weisst Du vielleicht Rat?

Vielen lieben Dank:D

Schöne Grüße aus Rheinland,

Eure Ratna
 
mit max
SQL:
SELECT 
  name,
  rank,
  CASE 
    WHEN rank = MAX(rank) OVER (PARTITION BY name) THEN 1
    ELSE 0
  END AS aktiv
FROM
  mytest
;

mit last value
SQL:
SELECT 
  name,
  rank,
  CASE 
    WHEN rank = LAST_VALUE(rank) OVER (PARTITION BY name ORDER BY rank RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) THEN 1
    ELSE 0
  END AS aktiv
FROM
  mytest
;
 
Zurück