Welche Artikel haben einen höheren Listenpreis als alle Artikel auf Lagerplatz 7?

OtenMoten

Benutzer
Beiträge
15
Hallo liebe Community,

ich arbeite derzeit die Übungsaufgaben in einem Buch durch.
Momentan am Abschnitt 'Join'.

Die aktuelle Frage, welche mit seit einigen Stunden verzweifeln lässt lautet:
"Welche Artikel haben einen höheren Listenpreis als alle Artikel auf Lagerplatz 7?"

Alle Attribute sind innerhalb einer Tabelle.

Könnt ihr mir weiterhelfen?

Liebe Grüße
 
Werbung:
EDIT:

Eine mögliche Lösung:
Code:
SELECT bezeichnung, listenpreis
FROM artikel
WHERE listenpreis > (SELECT SUM(listenpreis) FROM artikel WHERE lagerplatz = '7');

Jedoch verwende ich kein Join. Der Autor des Buches jedoch sagt, dass jede Aufgabe mit einem Join gelöst werden soll.
Hmn - habt ihr weitere Ideen?
 
mal als Idee...

Code:
test=*# \d artikel;
  Tabelle »public.artikel«
  Spalte  |  Typ  | Attribute
-------------+---------+-----------
 bezeichnung | text  |
 listenpreis | integer |
 lagerplatz  | integer |

test=*# select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
 bezeichnung | listenpreis
-------------+-------------
(0 Zeilen)

test=*#


Mal schauen, wie der Plan aussieht:

Code:
test=*# \d artikel;
  Tabelle »public.artikel«
  Spalte  |  Typ  | Attribute
-------------+---------+-----------
 bezeichnung | text  |
 listenpreis | integer |
 lagerplatz  | integer |
test=*# insert into artikel select 'artikel'|| (s/10)::text, (random()*1000)::int, (s/50)::int from generate_series(1, 100000) s;
INSERT 0 100000
test=*# analyse artikel;
ANALYZE
test=*# explain select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
  QUERY PLAN   
------------------------------------------------------------
 Seq Scan on artikel  (cost=0.00..1887.00 rows=49 width=19)
  Filter: (lagerplatz = 7)
(2 Zeilen)

test=*# create index index_lagerplatz on artikel(lagerplatz);
CREATE INDEX
test=*# explain select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
  QUERY PLAN   
----------------------------------------------------------------------------------
 Index Scan using index_lagerplatz on artikel  (cost=0.29..9.15 rows=49 width=19)
  Index Cond: (lagerplatz = 7)
(2 Zeilen)

test=*#

immerhin schlau genug, die Where-Condition in die gejointe Tabelle reinzudrücken ;-)
 
mal als Idee...

Code:
test=*# \d artikel;
  Tabelle »public.artikel«
  Spalte  |  Typ  | Attribute
-------------+---------+-----------
bezeichnung | text  |
listenpreis | integer |
lagerplatz  | integer |

test=*# select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
bezeichnung | listenpreis
-------------+-------------
(0 Zeilen)

test=*#


Mal schauen, wie der Plan aussieht:

Code:
test=*# \d artikel;
  Tabelle »public.artikel«
  Spalte  |  Typ  | Attribute
-------------+---------+-----------
bezeichnung | text  |
listenpreis | integer |
lagerplatz  | integer |
test=*# insert into artikel select 'artikel'|| (s/10)::text, (random()*1000)::int, (s/50)::int from generate_series(1, 100000) s;
INSERT 0 100000
test=*# analyse artikel;
ANALYZE
test=*# explain select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
  QUERY PLAN
------------------------------------------------------------
Seq Scan on artikel  (cost=0.00..1887.00 rows=49 width=19)
  Filter: (lagerplatz = 7)
(2 Zeilen)

test=*# create index index_lagerplatz on artikel(lagerplatz);
CREATE INDEX
test=*# explain select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
  QUERY PLAN
----------------------------------------------------------------------------------
Index Scan using index_lagerplatz on artikel  (cost=0.29..9.15 rows=49 width=19)
  Index Cond: (lagerplatz = 7)
(2 Zeilen)

test=*#

immerhin schlau genug, die Where-Condition in die gejointe Tabelle reinzudrücken ;-)


Danke für deine Antwort.
Ich kann es nur leider nicht interpretieren.

Habe es mit:

Code:
SELECT bezeichnung, a1.listenpreis
FROM artikel a1
INNER JOIN (SELECT SUM(listenpreis) AS listenpreis FROM artikel WHERE lagerplatz = '7') AS a2 ON a1.listenpreis > a2.listenpreis

gelöst. :)
 
Werbung:
mal als Idee...

Code:
test=*# \d artikel;
  Tabelle »public.artikel«
  Spalte  |  Typ  | Attribute
-------------+---------+-----------
bezeichnung | text  |
listenpreis | integer |
lagerplatz  | integer |

test=*# select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
bezeichnung | listenpreis
-------------+-------------
(0 Zeilen)

test=*#


Mal schauen, wie der Plan aussieht:

Code:
test=*# \d artikel;
  Tabelle »public.artikel«
  Spalte  |  Typ  | Attribute
-------------+---------+-----------
bezeichnung | text  |
listenpreis | integer |
lagerplatz  | integer |
test=*# insert into artikel select 'artikel'|| (s/10)::text, (random()*1000)::int, (s/50)::int from generate_series(1, 100000) s;
INSERT 0 100000
test=*# analyse artikel;
ANALYZE
test=*# explain select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
  QUERY PLAN 
------------------------------------------------------------
Seq Scan on artikel  (cost=0.00..1887.00 rows=49 width=19)
  Filter: (lagerplatz = 7)
(2 Zeilen)

test=*# create index index_lagerplatz on artikel(lagerplatz);
CREATE INDEX
test=*# explain select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
  QUERY PLAN 
----------------------------------------------------------------------------------
Index Scan using index_lagerplatz on artikel  (cost=0.29..9.15 rows=49 width=19)
  Index Cond: (lagerplatz = 7)
(2 Zeilen)

test=*#

immerhin schlau genug, die Where-Condition in die gejointe Tabelle reinzudrücken ;-)

Aus:
Code:
select bezeichnung, listenpreis from artikel left join (select lagerplatz, sum(listenpreis) from artikel group by lagerplatz) preise on artikel.lagerplatz=preise.lagerplatz where artikel.lagerplatz = 7;
Liefert leider die falsche Ergebnis-Menge:
Whisky 38.50
Portwein 12.45
Bier 5.20

Mach:
Code:
select bezeichnung, artikel.listenpreis
from artikel left join (select lagerplatz, sum(listenpreis) AS Sum_Preise from artikel group by lagerplatz) AS preise on artikel.lagerplatz = preise.lagerplatz where artikel.lagerplatz = 7;
Das korrekte Ergebnis lautet:
Schuhe 98.50
Hose 112.80
Damenhut 66.70
Sonnenbrille 76.00
 
Zurück
Oben