Summen mit left join

Summen mit left join

am 24.01.2008 15:55:00 von Stefan Dreyer

Hallo,

gegeben seien 3 Tabellen:

Warenkorb
wkid int ...

Artikelart1
artid
wkid int,
preis decimal (6,3)
...

Artikelart2
s.o.

Wenn ich nun ein left join mache:
SELECT SUM( a1.preis + a2.preis) FROM
Warenkorb wk
LEFT JOIN Artikelart1 a1 on a1.wkid=wk.wkid
LEFT JOIN Artikelart2 a2 on a2.wkid=wk.wkid

Dann erhalte ich natürlich eine leere Summe, wenn nur eine Artikelart im
Warenkorb ist, da die andere Summe ja NULL ist und wenn man irgendwas
ins schwarze Loch kippt, ist das ja nun mal weg;-)
Man kann ja nun ein if( a1.preis is null ,0,sum(a1.preis))... daraus
machen, aber geht so etwas noch eleganter?

Re: Summen mit left join

am 24.01.2008 20:47:17 von Thomas Rachel

Stefan Dreyer schrieb:
> Hallo,
>
> gegeben seien 3 Tabellen:
>
> Warenkorb
> wkid int ...
>
> Artikelart1
> artid
> wkid int,
> preis decimal (6,3)
> ...
>
> Artikelart2
> s.o.

Also erstmal ist Dein Tabellendesign...suboptimal.

Spricht was dagegen, die Tabellen Artikelart1 und Artikelart2
zusammenzulegen und einzusätzliches Feld art hinzuzufügen, welches dann
1 oder 2 sein kann?

Aber egal.

[snip]

> Man kann ja nun ein if( a1.preis is null ,0,sum(a1.preis))... daraus
> machen, aber geht so etwas noch eleganter?

Klar. Mit coalesce (portabel) oder ifnull (mysql-spezifisch).

Also sum(coalesce(a1.preis,0)+coalesce(a2.preis,0)) sollte es tun
(ungetestet).


HTH,


Thomas

Re: Summen mit left join

am 25.01.2008 11:04:19 von Stefan Dreyer

Thomas Rachel wrote:
> Stefan Dreyer schrieb:
>
>>Hallo,
>>
>>gegeben seien 3 Tabellen:
>>
>>Warenkorb
>> wkid int ...
>>
>>Artikelart1
>> artid
>> wkid int,
>> preis decimal (6,3)
>> ...
>>
>>Artikelart2
>> s.o.
>
>
> Also erstmal ist Dein Tabellendesign...suboptimal.
>
> Spricht was dagegen, die Tabellen Artikelart1 und Artikelart2
> zusammenzulegen und einzusätzliches Feld art hinzuzufügen, welches dann
> 1 oder 2 sein kann?
>
> Aber egal.

Es spricht dagegen, dass es wiederum für das Objektdesign, sowie für
andere Teile des Programmes suboptimal ist, die Tabellen
zusammenzulegen. Die Zahl der diskunkten Felder ist auch sehr groß,
da es sich um komplett andere Dinge dabei handelt, wo dann auch
ganz unterschiedliche Logiken dahinter stehen. Das, was ich dann
an dieser einen Stelle gewinnen würde, würde ich an anderer Stelle
um ein mehrfaches verlieren.
Aber ich habe genau gewusst, dass diese Anmerkung kommen wird.

>
> [snip]
>
>
>>Man kann ja nun ein if( a1.preis is null ,0,sum(a1.preis))... daraus
>>machen, aber geht so etwas noch eleganter?
>
>
> Klar. Mit coalesce (portabel) oder ifnull (mysql-spezifisch).
>
> Also sum(coalesce(a1.preis,0)+coalesce(a2.preis,0)) sollte es tun
> (ungetestet).

Werde ich mal ausprobieren.

Re: Summen mit left join

am 25.01.2008 14:06:01 von Thomas Rachel

Stefan Dreyer schrieb:

>> Spricht was dagegen, die Tabellen Artikelart1 und Artikelart2
>> zusammenzulegen und einzusätzliches Feld art hinzuzufügen, welches dann
>> 1 oder 2 sein kann?
>>
>> Aber egal.
>
> Es spricht dagegen, dass es wiederum für das Objektdesign, sowie für
> andere Teile des Programmes suboptimal ist, die Tabellen
> zusammenzulegen. Die Zahl der diskunkten Felder ist auch sehr groß,

Gut, dann paßt es ja.


> Aber ich habe genau gewusst, dass diese Anmerkung kommen wird.

Die Tabellen haben eben so ähnlich ausgesehen ...

Aber egal, war ja nur ne Anmerkung...


Thomas