Mehrere Tabellen verbinden ?

rollon

Benutzer
Beiträge
12
Guten Tag!

Ich bin ein österreichischer SQL-Newbie und suche eine Lösung für folgendes Problem:
Ich habe 2 Tabellen TEIL UND TEILUMSATZ. Ich selektiere die Teileliste vom Mandant 11 für alle Teile mit Bestand, verbunden mit TEILEUMSATZ, die folgende Struktur hat: Mandant, Teilnrextern, Zeitraumnummer, Umsatz.
Ich möchte zu jedem Ersatzteil mit Bestand die Umsätze der letzten 12 Zeiträume selektieren.

Wie könnte man das lösen ? Die aktuelle Zeitraumnummer ist in einer separaten Tabelle ZEITRAUM erfasst.(oder man nimmt die höchste Nummer bei TEILEUMSATZ - zur Zeit 176)

Wie bekomme ich die 12 letzen Monatsumsätze dazu ?

Vielen Dank für die Unterstützung und Ideen !
 
Werbung:
Danke für die Antworten. Die Tabellen sehen folgendermassen aus:
Tabelle TEIL
Mandant| teilnrextern | Bezeichnung | Bestand
-----------|---------------|----------------|-----------
11 |E001 | Glühbirne | 12
11 |E002 | Gummi | 14
11 |E003 | Sicherung | 0


TEILEUMSATZ
Mandant| Zeitraum | teilnrextern | Umsatz
-----------|------------|---------------|------------
11 |176 | E002 | 3
11 |176 | E001 | 5
11 |175 | E002 | 6
11 |174 | E001 | 4
11 |174 | E002 | 2
12 |174 | E002 | 88


gewünschte Ausgabe:

teilnrextern | Bezeichnung | Bestand | Umsatz akt.Monat | Umsatz 1| Umsatz 2 | Umsatz3 | Umsatz 4|.......| Umsatz 12 |
E001 | Glühbirne | 12 | 5 | 0 | 4
E002 | Gummi | 14 | 3 | 6 | 2

ich hoffe, ich habs einigermaßen verständlich rübergebracht.Wichtig wäre eine Zeile pro Teil und die letzen 13 Umsätze. (Wenn kein Umsatz dann Null ausgeben)
 
Zuletzt bearbeitet:
Code:
test=*# select * from teil;
mandant |  nr  |  name  | bestand
---------+------+-----------+---------
  11 | e001 | glühbirne |  12
  11 | e002 | gummi  |  14
  11 | e003 | sicherung |  0
(3 Zeilen)

test=*# select * from umsatz ;
mandant | zeitraum |  nr  | umsatz
---------+----------+------+--------
  11 |  176 | e002 |  3
  11 |  176 | e001 |  5
  11 |  175 | e002 |  6
  11 |  174 | e001 |  4
  11 |  174 | eoo2 |  2
  12 |  174 | e002 |  88
(6 Zeilen)

test=*# select nr, name, bestand, sum(umsatz) filter (where zeitraum=176) as umsatz_akt_monat, sum(umsatz) filter (where zeitraum=175) as umsatz_1, sum(umsatz) filter (where zeitraum=174) as umsatz_2 from teil t left join umsatz u using (nr) where u.mandant=11 group by nr, name, bestand order by nr;
  nr  |  name  | bestand | umsatz_akt_monat | umsatz_1 | umsatz_2
------+-----------+---------+------------------+----------+----------
e001 | glühbirne |  12 |  5 |  |  4
e002 | gummi  |  14 |  3 |  6 |  
(2 Zeilen)

test=*#

Vermutlich wird Deine DB nicht mit der FILTER-Syntax klarkommen, dann umschreiben zu

Code:
test=*# select nr, name, bestand, sum(case when zeitraum=176 then umsatz else 0 end) as umsatz_akt_monat, sum(umsatz) filter (where zeitraum=175) as umsatz_1, sum(umsatz) filter (where zeitraum=174) as umsatz_2 from teil t left join umsatz u using (nr) where u.mandant=11 group by nr, name, bestand order by nr;
  nr  |  name  | bestand | umsatz_akt_monat | umsatz_1 | umsatz_2
------+-----------+---------+------------------+----------+----------
e001 | glühbirne |  12 |  5 |  |  4
e002 | gummi  |  14 |  3 |  6 |  
(2 Zeilen)

test=*#

(siehe umsatz_akt_monat)
 
Ich hab folgendes probiert:
select teilnrextern, BEZEICHNUNG, GESBESTANDMENGE , sum(case when umsa.UMSATZZEITRAUMLFDR=176 then umsa.NORMALUMSATZ else 0 end) as umsatz_akt_monat from teil t left join teileumsatz umsa using (teilnrextern) where umsa.mandant=11 group by teilnrextern, BEZEICHNUNG, GESBESTANDMENGE order by teilnrextern

Leider kommt dann diese Fehlermeldung:
select teilnrextern, BEZEICHNUNG, GESBESTANDMENGE , sum(case when umsa.UMSATZZEITRAUMLFDR=176 then umsa.NORMALUMSATZ else 0 end) as umsatz_akt_monat from teil t left join teileumsatz umsa using (teilnrextern) where umsa.mandant=11 group by teilnrextern, BEZEICHNUNG, GESBESTANDMENGE order by teilnrextern QuerySyntaxError
< DBD::Oracle::db prepare failed: ORA-00904: "UMSA"."MANDANT": ungültiger Bezeichner (DBD ERROR: error possibly near <*> indicator at char 215 in 'select teilnrextern, BEZEICHNUNG, GESBESTANDMENGE , sum(case when umsa.UMSATZZEITRAUMLFDR=176 then umsa.NORMALUMSATZ else 0 end) as umsatz_akt_monat from teil t left join teileumsatz umsa using (teilnrextern) where <*>umsa.mandant=11 group by teilnrextern, BEZEICHNUNG, GESBESTANDMENGE order by teilnrextern')
 
Keine Idee, warum Ora das nicht mag. Hast schon mal bis 215 ausgezählt, welche Stelle es nicht mag? Kann es ein GROß/kleinScHrEiBuNgSpRoBlEm sein?
 
Jetzt funktioniert es! Jedoch bekomme ich nur 3745 Treffer In der Tabelle Teil gibt es aber 4007 Teile mit Gesbestandmenge >0
Folgendes habe ich ausgeführt:
select teilnrextern, BEZEICHNUNG , GESBESTANDMENGE , sum(case when UMSATZZEITRAUMLFDR=166 then NORMALUMSATZ else 0 end) as umsatz_akt_monat from teil t left join teileumsatz u using (teilnrextern) where u.mandantnr=11 and t.mandantnr=11 and ZEITRAUMART = 'M' and t.GESBESTANDMENGE>0 group by teilnrextern, BEZEICHNUNG, GESBESTANDMENGE order by teilnrextern
 
Werbung:
In der Suchbedingung steht immer mandantnr=11.
Kann es sein, dass wenn es keinen Datensatz in der Tabelle Teileumsatz gibt, nichts ausgeben wird ? Es müssten alle Teile mit Bestand ausgegeben werden, egal ob es einen Eintrag in Teileumsatz gibt.
 
Zurück
Oben