komplizierte Abfrage

15/10/2007 - 23:04 von Michael Vollmer | Report spam
Hallo NG,

folgender Tabellenaufbau:

Rechnungstabelle: RechnungPositionen:
RechID | Datum Rech_ID | Set_ID | menge | preis
100 | .. 100 | 587 | 2 | 654,00
100 | 607 | 3 | 78,45

Set-Tabelle: Set-Artikel-Zuordnungen:
Set_ID | .. Set_ID | Artikel_ID | Menge
587 | .. 587 | 5690 | 8
607 | ..Ž 587 | 5700 | 8
607 | 4600 | 5

Artikel-Tabelle:
Artikel_ID | EK (=> Einkauf-Preis)
-
5690 | 6.75 |
5700 | 2.89 |
4600 | 7.99 |


Verknüpfungen:
=> RechnungsTab.RechID = RechPositionenTab.Rech_ID
=> RechPositionenTab.Set_ID = SetTab.Set_ID
=> SetTab.Set_ID = SetArtikelTAB.Set_ID
die Set-Artikel-Tabelle enthàlt alle möglichen Artikel, die in
ein Set gehören: hier im Beispiel hat das Set mit der Nr. 587
2 dazugehörige Artikel: 5690 + 5700...das Set Nr. 607 hingegen
hat im Moment nur einen Artikel zugeordnet
=> SetArtikelTAB.Set_ID = ArtikelTab.Artikel_ID
(ich hoffe, ich konnte anhand der gleichen Bezeichnungen der Spaltennamen
die Verknüpfungen in die jweiligen anderen Tabellen kenntlich machen)

Problem:
Ich möchte erreichen, dass mir der mögliche Gewinn für eine Rechnung
angezeigt wird. D.h. es muss in den Rechnungspositionen geschaut werden,
welche Sets verkauft wurden. Anhand dieser SetID's die dazugehörigen
Artikel aus dem Zuordnungstabelle genommen werden und mit der
Artikeltabelle verknüpft, damit man die Einkaufspreise dieser Artikel
erhàlt. Bisher scheitere ich daran, dies ganze in EINER Abfrage
unterzubringen/zu realisieren.

meine bisheriger Ansatz:
-
SELECT SUM(SetArtikelTAB.Menge * ArtikelTab.EK * RechPositionenTab.menge)
AS Einkauf,
SUM(RechPositionenTab.menge * RechPositionenTab.preis) AS Umsatz
FROM RechnungsTab INNER JOIN
RechPositionenTab ON RechnungsTab.RechID = RechPositionenTab.Rech_ID
INNER JOIN
SetTab ON RechPositionenTab.Set_ID = SetTab.Set_ID INNER JOIN
SetArtikelTAB ON SetTab.Set_ID = SetArtikelTAB.Set_ID INNER JOIN
ArtikelTab ON tblArtikel_Set.Artikel_ID = ArtikelTab.Artikel_ID
WHERE (RechnungsTab.ID_inv = 200500001)

diese Abfrage liefert mir ein kartesisches Produkt.
Ausgabe: Einkauf: 274,09 und Umsatz: 2851,35
wenn man das SUM um die beiden Aggregatausdrücke wegnimmt, sieht man
das Problem deutlich. Da das eine Set (587) 2 Artikel hat, wird der
Einkaufs- sowie Umsatzwert des Sets ebenfals 2 mal summiert. Dies ist
jedoch falsch.
Kann man das irgendwie verhindern bzw. durch Umstellen umgehen?????

Bzw. wie löst man diese Problem am gescheitesten?

Ziel der Abfrage war es nochmal, dass der Gewinn für eine Rechnung
berechnet wird: es muss dazu die Mengenangabe bei der Set-Artikel-Zurodnung
sowie die verkaufte Set-Anzahl in den Rechnungspositionen berücksichtigt
werden um den fixen Einkaufswert zu erhalten.

Ich hoffe ihr könnt mir weiter helfen.

Gruß
Micha
 

Lesen sie die antworten

#1 Hannes Brunner
16/10/2007 - 12:12 | Warnen spam
Hallo Michael,

Michael Vollmer schrieb:
Hallo NG,

folgender Tabellenaufbau:

Rechnungstabelle: RechnungPositionen:
RechID | Datum Rech_ID | Set_ID | menge | preis
100 | .. 100 | 587 | 2 | 654,00
100 | 607 | 3 | 78,45

Set-Tabelle: Set-Artikel-Zuordnungen:
Set_ID | .. Set_ID | Artikel_ID | Menge
587 | .. 587 | 5690 | 8
607 | ..Ž 587 | 5700 | 8
607 | 4600 | 5

Artikel-Tabelle:
Artikel_ID | EK (=> Einkauf-Preis)
-
5690 | 6.75 |
5700 | 2.89 |
4600 | 7.99 |

Verknüpfungen:
=> RechnungsTab.RechID = RechPositionenTab.Rech_ID
=> RechPositionenTab.Set_ID = SetTab.Set_ID
=> SetTab.Set_ID = SetArtikelTAB.Set_ID
die Set-Artikel-Tabelle enthàlt alle möglichen Artikel, die in
ein Set gehören: hier im Beispiel hat das Set mit der Nr. 587
2 dazugehörige Artikel: 5690 + 5700...das Set Nr. 607 hingegen
hat im Moment nur einen Artikel zugeordnet
=> SetArtikelTAB.Set_ID = ArtikelTab.Artikel_ID
(ich hoffe, ich konnte anhand der gleichen Bezeichnungen der Spaltennamen
die Verknüpfungen in die jweiligen anderen Tabellen kenntlich machen)

Problem:
Ich möchte erreichen, dass mir der mögliche Gewinn für eine Rechnung
angezeigt wird.



das geht mit einer abgeleiteten Tabelle:

SELECT RechnungsTab.Rech_ID,
SUM(RechPositionenTab.menge * RechPositionenTab.preis) AS Umsatz,
SUM(RechPositionenTab.menge * SetEK.EK) AS Einkauf
FROM RechnungsTab INNER JOIN RechPositionenTab
ON RechnungsTab.RechID = RechPositionenTab.Rech_ID
INNER JOIN (
SELECT SetArtikelTAB.Set_ID,
Sum(SetArtikelTAB.Menge * ArtikelTab.EK) AS EK
FROM SetArtikelTAB INNER JOIN ArtikelTab
ON SetArtikelTAB.Set_ID = ArtikelTab.Artikel_ID
GROUP BY Set_ID
) AS SetEK
ON SetEK.Set_ID = RechPositionenTab.Set_ID
GROUP BY Rech_ID

Oder mit einem Subselect:

SELECT RechnungsTab.Rech_ID,
SUM(RechPositionenTab.menge * RechPositionenTab.preis) AS Umsatz,
SUM(RechPositionenTab.menge * (
SELECT Sum(SetArtikelTAB.Menge * ArtikelTab.EK)
FROM SetArtikelTAB INNER JOIN ArtikelTab
ON SetArtikelTAB.Set_ID = ArtikelTab.Artikel_ID
WHERE SetArtikelTAB.Set_ID = RechPositionenTab.Set_ID
)) AS Einkauf
FROM RechnungsTab INNER JOIN RechPositionenTab
ON RechnungsTab.RechID = RechPositionenTab.Rech_ID
GROUP BY Rech_ID

Falls du alle Rechnungen auswerten willst, dürfte der erste Ansatz der
performantere sein, für ein einzelne Rechnung der zweite.

Gruß
Hannes

Ähnliche fragen