Alternative Spalte abfragen, wenn bestimmter Eintrag

watchdogg

Neuer Benutzer
Beiträge
2
Hallo Forum,

ich bin neu hier und beisse mir grad an einer SQL-Abfrage die Zähne aus:

Ich habe die Tabelle DATEN. Es geht mir um 3 Spalten aus der Tabelle. AUFTRAG, HINWEIS, VERBRAUCH.

Es gibt jetzt den Fall, dass die Spalte AUFTRAG die Zeichenkette 'RESTBUCHUNG' beinhalten kann.
Wenn das so ist, interessiert mich die Spalte HINWEIS nicht.
Andernfalls interessiert nur die Spalte HINWEIS.

Was ich aber immer brauche ist die Spalte VERBRAUCH.
Und zwar immer die Summe bei gleichem Wert in der Spalte 'AUFTRAG' oder beim Wert 'RESTBUCHUNG' in HINWEIS.

Also brauche ich GROUP BY in Verbindung mit sum(VERBRAUCH).

Wo ich mich schwer tue ist nun das Herunziehen von entweder der Spalte 'AUFTRAG' oder der Spalte 'HINWEIS' in Verbindung mit der Summe der Spalte 'VERBRAUCH'.

Meine kläglichen Versuche sehen so aus:

Code:
SELECT CASE WHEN AUFT = 'RESTBUCHUNG ' THEN AUFT ELSE HIN END as EINTRAG, SUM(VERB) as METER
  FROM (SELECT AUFTRAG AS AUFT, HINWEIS AS HIN, VERBRAUCH AS VERB FROM DATEN)
  DATEN
GROUP BY EINTRAG, METER

Da kommt "Ungültiger Spaltenname 'EINTRAG'" / "Ungültiger Spaltenname 'METER'"

Ich hoffe Ihr wisst was ich meine.
Wie kann ich das Problem lösen?


MfG watchdogg
 
Werbung:
Ich hoffe Ihr wisst was ich meine.
Wie kann ich das Problem lösen?


MfG watchdogg

Falls ich Dirch richtig verstehe hast Du:

Code:
test=*# select * from watchdog ;
 auftrag | hinweis | verbrauch
---------+---------+-----------
 rest  | egal  |  10
 x  | foo  |  12
 y  | bla  |  13
 z  | foo  |  14
(4 rows)

und suchst

Code:
test=*# select info, sum(verbrauch) from (select case when auftrag = 'rest' then auftrag else hinweis end as info, verbrauch from watchdog) zwischentabelle group by info ;
 info | sum
------+-----
 foo  |  26
 bla  |  13
 rest |  10
(3 rows)
 
Die Fehlermeldung bezieht sich auf deine beiden im GROUP BY genannten Spalten. "Meter" willst du im GROUP BY gar nicht haben denn das ist ja die aggregierte Spalte. "Eintrag" hingegen willst du schon haben, aber: "Eintrag" ist nur der Alias und der wird erst im Select "erzeugt", steht also im GROUP BY nicht zur Verfügung. Eine Lösung wäre ein "veraschachtelter" Select wo erst eine Abfrage die Spalte "Eintrag" erzeugt und eine weitere Abfrage diese Spalte für GROUP BY nutzt, siehe akretschmers Lösungs-Code. Alternativ kannst du auch die selbe CASE Anweisung in deinem GROUP BY nutzen:
Code:
SELECT    ( CASE WHEN AUFTRAG = 'RESTBUCHUNG ' THEN AUFTRAG ELSE HINWEIS END ) AS EINTRAG,
        SUM(VERBRAUCH) AS METER
FROM    DATEN
GROUP BY ( CASE WHEN AUFTRAG = 'RESTBUCHUNG ' THEN AUFTRAG ELSE HINWEIS END )
 
Werbung:
Mensch, seid ihr genial.

Hier ist die Lösung mit WHERE-Klausel:

Code:
SELECT info, SUM(VERBRAUCH)
FROM (SELECT CASE WHEN AUFTRAG='RESTBUCHUNG' THEN AUFTRAG ELSE HINWEIS END AS info, VERBRAUCH, DATUM FROM DATEN)
    AS TempTable
WHERE YEAR(DATUM) = 2014
GROUP BY info

Vielen Dank.

Gruß, watchdogg
 
Zurück
Oben