From: | "Albe Laurenz" <laurenz(dot)albe(at)wien(dot)gv(dot)at> |
---|---|
To: | <marc(dot)hanisch(at)ateam(dot)de>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: CASE und Aggregatfunktion |
Date: | 2009-03-26 13:00:47 |
Message-ID: | D960CB61B694CF459DCFB4B0128514C202FF650D@exadv11.host.magwien.gv.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
Marc Hanisch wrote:
> ich nutze öfter eine Query in ähnlicher Art und Weise:
>
> SELECT name,
> CASE WHEN SUM(betrag) > 0
> THEN SUM(betrag)
> ELSE 0
> END AS einnahmen,
> CASE WHEN SUM(betrag) < 0
> THEN SUM(betrag)
> ELSE 0
> END AS ausgaben
> FROM table
> GROUP BY name
>
> Erreichen will ich damit, dass ein und das selbe Feld in Abhängigkeit
> des Inhaltes also unter anderem Namen (einnahmen und ausgaben) ausgeben
> wird.
> Es erscheint mir aber umständlich, dass ich PostgreSQL für die Bedingung
> (WHEN) und für die Anweisung (THEN) um die Summierung bemühen muss, was
> ja wahrscheinlich doppelt Performance frisst... Gibt es da einen
> eleganteren Weg? Schließlich wurde die Summe des Betrages ja bei der
> ersten Bedingung bereits berechnet.
Ich muß zuerst einmal sagen, ich bin nicht sicher, ob PostgreSQL in diesem
Fall die Summe wirklich mehrmals berechnet - da kann vielleicht wer
Berufenerer Auskunft geben.
Ich hätte die Abfrage so formuliert:
SELECT name,
CASE WHEN sum_betrag) > 0
THEN sum_betrag)
ELSE 0
END AS einnahmen,
CASE WHEN sum_betrag) < 0
THEN sum_betrag)
ELSE 0
END AS ausgaben
FROM (SELECT name, sum(betrag) AS sum_betrag
FROM table
GROUP BY name) dummy;
Liebe Grüße,
Laurenz Albe
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas 'ads' Scherbaum | 2009-03-29 00:53:28 | FrOSCon 2009 |
Previous Message | Marc Hanisch | 2009-03-26 12:04:40 | Re: CASE und Aggregatfunktion |