schneerunzel
Benutzer
- Beiträge
- 6
Hallo zusammen,
wahrscheinlich denke ich an dieser Stelle einfach viel zu kompliziert und es ist gar nicht "so schlimm".
Folgende Situation (einmal etwas vereinfacht dargestellt):
Es existieren folgende 5 Tabellen:
- Artikelstamm (artikelid, Artikelnummer, Bezeichnung)
- Kunden (kundenid, Kundenname)
- Preislisten (preislistenid, Preislistenbezeichnung)
- Preislisten_Artikel (preislistenid, artikelid, Preis)
- Preislisten_Kunde (preislistenid, kundenid)
Es gibt Kunden, die haben eine eigene Preisliste, es gibt Kunden die teilen sich eine Preisliste und es gibt auch Kunden die haben gar keine Preisliste (sprich es gibt keinen Eintrag für diesen Kunden in der Tabelle Preislisten_Kunde). Ein Kunde kann immer nur eine Preisliste haben. Eine Preisliste kann aber mehren Kundenzugeordnet sein.
In der Tabelle Preisliste gibt es X Preislisten. Allerdings gibt es einen Preisliste mit der ID 1 Standard.
Diese Preisliste gilt für alle Kunden. In dieser Preisliste sind nicht alle Artikel enthalten.
Wenn ein Kunde keine Preisliste hat (sprich es gibt keine Definition in der Tabelle Preislisten_Kunde), stehen diesem Kunden nur die Artikel (mit den entsprechenden Preisen) zur Verfügung, die in der Tabelle Preislisten_Artikel für die Preisliste mit der preislistenid 1 definiert sind.
Wenn einem Kunden eine Preisliste über die Tabelle Preislisten_Kunde zugeordnet ist, stehen diesem Kunden die Artikel der definierten Preisliste zur Verfügung. Außerdem stehen dem Kunden auch die Artikel der Standardpreisliste zur Verfügung.
Wenn ein Artikel auf beiden Preislisten steht, gilt jedoch der Preis der auf der mit dem Kunden vereinbarten Preisliste stehet (sowohl niedriger als auch höher)
Hier einmal das Beispiel:
Ich kennen jetzt die Kundenid und möchte alle Artikel sehen, die der Kunden kaufen kann und den jeweiligen Preis.
Ergebnis der SQL Abfrage sollte als folgendes sein:
Kunde A:
Schraube (00001) - 1,00€
Hammer (00002) - 15,00€
Versandkosten (00006) - 4,99€
(Da für Kunde 1 keine Preisliste hinterlegt ist hat der Kunde nur Zugriff auf die Standard Preisliste)
Kunde B/Kunde C:
Schraube (00001) - 0,75€
Hammer (00002) - 15,00€
Säge (00003) - 10,00€
Versandkosten (00006) - 4,99€
Kunde D:
Schraube (00001) - 0,50€
Hammer (00002) - 20,00€
Spachtel(00004) - 5,00€
Versandkosten (00006) - 4,99€
wie gehe ich hier vor.
Mein erster Ansatz sah wie folgt aus:
SELECT
Kunden.kundenid,
Kunden.Kundenname,
Preislisten.Preislistenbezeichnung,
artikelstamm.Artikelnummer,
artikelstamm.Bezeichnung,
Preislisten_Artikel.Preis
FROM
artikelstamm
LEFT JOIN
Preislisten_Artikel ON Preislisten_Artikel.artikelid = artikelstamm.artikelid
LEFT JOIN
Preislisten ON Preislisten.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Preislisten_Kunde ON Preislisten_Kunde.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Kunden ON Kunden.kundenid = Preislisten_Kunde.kundenid
WHERE
Kunden.kundenid = 2
Das liefert allerdings natürlich nur das zurück was auf der zugeordneten Preisliste steht.
Nächster Schritt war dann:
SELECT
Kunden.kundenid,
Kunden.Kundenname,
Preislisten.Preislistenbezeichnung,
artikelstamm.Artikelnummer,
artikelstamm.Bezeichnung,
Preislisten_Artikel.Preis
FROM
artikelstamm
LEFT JOIN
Preislisten_Artikel ON Preislisten_Artikel.artikelid = artikelstamm.artikelid
LEFT JOIN
Preislisten ON Preislisten.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Preislisten_Kunde ON Preislisten_Kunde.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Kunden ON Kunden.kundenid = Preislisten_Kunde.kundenid
WHERE
Preislisten.preislistenid = 1 or Kunden.kundenid = 2
Das sieht dann schon einmal viel besser aus.
Allerdings taucht der Artikel Schraube jetzt wieder zweimal auf.
Ab hier komme ich nicht wirklich weiter. Meine Versuche mit Group By Artikelid sind daran gescheitert, dass ich es nicht hin bekommen habe, dass immer die Kundenspezifische Preisliste "gewinnt".
Vielen Dank für Eure Hilfe vorab.
wahrscheinlich denke ich an dieser Stelle einfach viel zu kompliziert und es ist gar nicht "so schlimm".
Folgende Situation (einmal etwas vereinfacht dargestellt):
Es existieren folgende 5 Tabellen:
- Artikelstamm (artikelid, Artikelnummer, Bezeichnung)
- Kunden (kundenid, Kundenname)
- Preislisten (preislistenid, Preislistenbezeichnung)
- Preislisten_Artikel (preislistenid, artikelid, Preis)
- Preislisten_Kunde (preislistenid, kundenid)
Es gibt Kunden, die haben eine eigene Preisliste, es gibt Kunden die teilen sich eine Preisliste und es gibt auch Kunden die haben gar keine Preisliste (sprich es gibt keinen Eintrag für diesen Kunden in der Tabelle Preislisten_Kunde). Ein Kunde kann immer nur eine Preisliste haben. Eine Preisliste kann aber mehren Kundenzugeordnet sein.
In der Tabelle Preisliste gibt es X Preislisten. Allerdings gibt es einen Preisliste mit der ID 1 Standard.
Diese Preisliste gilt für alle Kunden. In dieser Preisliste sind nicht alle Artikel enthalten.
Wenn ein Kunde keine Preisliste hat (sprich es gibt keine Definition in der Tabelle Preislisten_Kunde), stehen diesem Kunden nur die Artikel (mit den entsprechenden Preisen) zur Verfügung, die in der Tabelle Preislisten_Artikel für die Preisliste mit der preislistenid 1 definiert sind.
Wenn einem Kunden eine Preisliste über die Tabelle Preislisten_Kunde zugeordnet ist, stehen diesem Kunden die Artikel der definierten Preisliste zur Verfügung. Außerdem stehen dem Kunden auch die Artikel der Standardpreisliste zur Verfügung.
Wenn ein Artikel auf beiden Preislisten steht, gilt jedoch der Preis der auf der mit dem Kunden vereinbarten Preisliste stehet (sowohl niedriger als auch höher)
Hier einmal das Beispiel:

Ich kennen jetzt die Kundenid und möchte alle Artikel sehen, die der Kunden kaufen kann und den jeweiligen Preis.
Ergebnis der SQL Abfrage sollte als folgendes sein:
Kunde A:
Schraube (00001) - 1,00€
Hammer (00002) - 15,00€
Versandkosten (00006) - 4,99€
(Da für Kunde 1 keine Preisliste hinterlegt ist hat der Kunde nur Zugriff auf die Standard Preisliste)
Kunde B/Kunde C:
Schraube (00001) - 0,75€
Hammer (00002) - 15,00€
Säge (00003) - 10,00€
Versandkosten (00006) - 4,99€
Kunde D:
Schraube (00001) - 0,50€
Hammer (00002) - 20,00€
Spachtel(00004) - 5,00€
Versandkosten (00006) - 4,99€
wie gehe ich hier vor.
Mein erster Ansatz sah wie folgt aus:
SELECT
Kunden.kundenid,
Kunden.Kundenname,
Preislisten.Preislistenbezeichnung,
artikelstamm.Artikelnummer,
artikelstamm.Bezeichnung,
Preislisten_Artikel.Preis
FROM
artikelstamm
LEFT JOIN
Preislisten_Artikel ON Preislisten_Artikel.artikelid = artikelstamm.artikelid
LEFT JOIN
Preislisten ON Preislisten.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Preislisten_Kunde ON Preislisten_Kunde.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Kunden ON Kunden.kundenid = Preislisten_Kunde.kundenid
WHERE
Kunden.kundenid = 2
Das liefert allerdings natürlich nur das zurück was auf der zugeordneten Preisliste steht.

Nächster Schritt war dann:
SELECT
Kunden.kundenid,
Kunden.Kundenname,
Preislisten.Preislistenbezeichnung,
artikelstamm.Artikelnummer,
artikelstamm.Bezeichnung,
Preislisten_Artikel.Preis
FROM
artikelstamm
LEFT JOIN
Preislisten_Artikel ON Preislisten_Artikel.artikelid = artikelstamm.artikelid
LEFT JOIN
Preislisten ON Preislisten.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Preislisten_Kunde ON Preislisten_Kunde.preislistenid = Preislisten_Artikel.preislistenid
LEFT JOIN
Kunden ON Kunden.kundenid = Preislisten_Kunde.kundenid
WHERE
Preislisten.preislistenid = 1 or Kunden.kundenid = 2
Das sieht dann schon einmal viel besser aus.

Allerdings taucht der Artikel Schraube jetzt wieder zweimal auf.
Ab hier komme ich nicht wirklich weiter. Meine Versuche mit Group By Artikelid sind daran gescheitert, dass ich es nicht hin bekommen habe, dass immer die Kundenspezifische Preisliste "gewinnt".
Vielen Dank für Eure Hilfe vorab.