Re: CASE und Aggregatfunktion

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

In response to

Browse pgsql-de-allgemein by date

  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