zwei Tabellen mit unterschiedlichen Werten

zwei Tabellen mit unterschiedlichen Werten

am 26.03.2007 14:44:38 von Mathias Fiedler

Hallo,

ich habe für einen Shop eine Tabelle mit den Artikeln. Diese Tabelle
enthält auch den Preis. Allerdings gibt es nun noch eine weitere Tabelle,
die jeweils die Kundennummer, die Artikelnummer und den Kundenpreis
enthält. Jeder Kunde kann also für ausgewählte Produkte einen Sonderpreis
haben. Meine Abfrage lautet nun zuerst auf die Artikeltabelle, dann möchte
ich mit der aktuellen UserID in der Sonderpreistabelle nach den
Atikelnummern für Sonderpreise des angemeldeten Users suchen. Wenn der also
Sonderpreise hat, soll aus der Sonderpreistabelle der Sonderproes genommen
werden, gibt es keinen, gilt der Preis aus der Artikeltabelle.

Hier nochmal:
Tabelle 1

artikelnummer | artikelname | preis
1 | test1 | 12.40
2 | test2 | 2.00
3 | test3 | 8.70

Tabelle 2
kundennummer | artkelnummer | preis
3 | 3 | 7.50

Meine Abfrage nach den Artikelnm mit preisen:

SELECT artikelnummer, artikelname, preis FROM .......

soll nun folgendes Ergebnis enthalten:

artikelnummer | artikelname | preis
1 | test1 | 12.40
2 | test2 | 2.00
3 | test3 | 7.50

Wie stelle ich das an?

mfg

Mathias

Re: zwei Tabellen mit unterschiedlichen Werten

am 26.03.2007 14:55:18 von Helmut Chang

Mathias Fiedler schrieb:

> Wenn der also
> Sonderpreise hat, soll aus der Sonderpreistabelle der Sonderproes genommen
> werden, gibt es keinen, gilt der Preis aus der Artikeltabelle.
>
> Hier nochmal:
> Tabelle 1
>
> artikelnummer | artikelname | preis
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 8.70
>
> Tabelle 2
> kundennummer | artkelnummer | preis
> 3 | 3 | 7.50
>
> Meine Abfrage nach den Artikelnm mit preisen:
>
> SELECT artikelnummer, artikelname, preis FROM .......
>
> soll nun folgendes Ergebnis enthalten:
>
> artikelnummer | artikelname | preis
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 7.50
>
> Wie stelle ich das an?

LEFT JOIN auf Tabelle 2 mit WHERE-Bedingung auf die Kundennummer.

Gibt es einen Datensatz, hast du in den Feldern aus Tabelle 2 Werte
ansonsten, NULL.

Darauf aufbauend kannst du mit CASE oder IFNULL entscheiden, ob du
Tabelle1.preis oder Tabelle2.preis haben möchtest.

gruss, heli

Re: zwei Tabellen mit unterschiedlichen Werten

am 26.03.2007 14:56:58 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: zwei Tabellen mit unterschiedlichen Werten

am 26.03.2007 15:05:03 von Thomas Rachel

Mathias Fiedler wrote:

> Hier nochmal:
> Tabelle 1
>
> artikelnummer | artikelname | preis
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 8.70
>
> Tabelle 2
> kundennummer | artkelnummer | preis
> 3 | 3 | 7.50
>
> Meine Abfrage nach den Artikelnm mit preisen:
>
> SELECT artikelnummer, artikelname, preis FROM .......
>
> soll nun folgendes Ergebnis enthalten:
>
> artikelnummer | artikelname | preis
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 7.50
>
> Wie stelle ich das an?

Hmmm...

SELECT tab1.artikelnummer, artikelname, COALESCE(tab2.preis,tab1.preis)
FROM tab1 LEFT JOIN tab2
ON tab1.artikelnummer=tab2.artikelnummer AND tab2.kundennummer=...

Das LEFT JOIN joint Dir für tab1, sofern vorhanden, die passenden Zeilen aus
tab2 dran, gibt es jedoch keine, enthalten die entsprechenden Felder NULL.

COALESCE() schaut, ob NILL drin ist - wenn ja, wird der "Default" genommen.


HTH,

Thomas
--
Ein Vorschlag zur Fortsetzung einer Diskussion in da0 ist also der ironische
Hinweis des Posters darauf, dass er der Diskussion außer der durch die
dadurch am Prozessor entstehende Verlustleistung freiwerdenden Wärme nichts
mehr abgewinnen kann. ;-) (Volker Gringmuth in de.newusers.questions)

Re: zwei Tabellen mit unterschiedlichen Werten

am 27.03.2007 09:38:34 von Mathias Fiedler

Am Mon, 26 Mar 2007 14:56:58 +0200 schrieb Andreas Kretschmer:

> begin Mathias Fiedler schrieb:
>> Hallo,
>>
>> ich habe für einen Shop eine Tabelle mit den Artikeln. Diese Tabelle
>> enthält auch den Preis. Allerdings gibt es nun noch eine weitere Tabelle,
>> die jeweils die Kundennummer, die Artikelnummer und den Kundenpreis
>> enthält. Jeder Kunde kann also für ausgewählte Produkte einen Sonderpreis
>> haben. Meine Abfrage lautet nun zuerst auf die Artikeltabelle, dann möchte
>> ich mit der aktuellen UserID in der Sonderpreistabelle nach den
>> Atikelnummern für Sonderpreise des angemeldeten Users suchen. Wenn der also
>> Sonderpreise hat, soll aus der Sonderpreistabelle der Sonderproes genommen
>> werden, gibt es keinen, gilt der Preis aus der Artikeltabelle.
>>
>> Hier nochmal:
>> Tabelle 1
>>
>> artikelnummer | artikelname | preis
>> 1 | test1 | 12.40
>> 2 | test2 | 2.00
>> 3 | test3 | 8.70
>>
>> Tabelle 2
>> kundennummer | artkelnummer | preis
>> 3 | 3 | 7.50
>>
>> Meine Abfrage nach den Artikelnm mit preisen:
>>
>> SELECT artikelnummer, artikelname, preis FROM .......
>>
>> soll nun folgendes Ergebnis enthalten:
>>
>> artikelnummer | artikelname | preis
>> 1 | test1 | 12.40
>> 2 | test2 | 2.00
>> 3 | test3 | 7.50
>>
>> Wie stelle ich das an?
>
>
> Schnellschuß:
>
> test=*# select * from t1;
> artikel | name | preis
> ---------+-------+-------
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 8.70
> (3 rows)
>
> test=*# select * from t2;
> kunde | artikel | preis
> -------+---------+-------
> 3 | 3 | 7.50
> (1 row)
>
> test=*# select t1.artikel, t1.name, coalesce(case when t1.preis < t2.preis then t1.preis else t2.preis end, t1.preis) from t1 left join t2 on t1.artikel=t2.artikel and t2.kunde = 3;
> artikel | name | coalesce
> ---------+-------+----------
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 7.50
> (3 rows)
>
> test=*# select t1.artikel, t1.name, coalesce(case when t1.preis < t2.preis then t1.preis else t2.preis end, t1.preis) from t1 left join t2 on t1.artikel=t2.artikel and t2.kunde = 2;
> artikel | name | coalesce
> ---------+-------+----------
> 1 | test1 | 12.40
> 2 | test2 | 2.00
> 3 | test3 | 8.70
> (3 rows)
>
>
>
> end
> Andreas

Danke, das funktioniert.
Hast mir sehr geholfen.

mfg

Mathias