komplizierte Join-Abfrage mit rechenoperatoren
hermesias
- datenbank
- sql
Guten Abend ins Forum! Ich (Florian) bin erst gerade offiziell dazu gestoßen. Bislang habe ich immer alles in Beträgen gefunden und konnte so meinen Code entwickeln, aber nun wird meine Problemstellung doch zu komplex und ich muss euch Experten fragen:
Meine Datenbank hat folgende Tabellen:
Den einzelnen Rechnungen werden mittels Kundennummer 'k_id' Kunden zugeordnet. Anhand von Positionen in der Tabelle Warenkorb wird ersichtlich in welcher Rechnung (r_id) welche Menge (menge) der einzelnen Artikel (a_id) aus der Tabelle TBL_artikel gekauft wird. In der Tabelle TBL_artikel ist hinterlegt, welcher Artikel zu welchem Preis angeboten wird.
Auflistung der Rechnungen anhand r_id:
Gib die Liste aller Rechnungen als Tabelle per php script aus, - mit den Spalten: r_id, kunde, rechnungsdatum, gesamtbetrag.
Geht das überhaupt über eine JOIN Abfrage mit Rechenoperatoren oder muss ich das irgendwie anders lösen?
freue mich sehr über Antworten
Hallo hermesias,
das geht definitiv, wird aber ein ziemlich fettes SQL Statement. Guck ich mir nachher mal an.
Mich irritiert nur, dass da ein paar Vereinfachungen drin sind, die die Aufgabe praxisfremd machen. Z.b. das getrennte Ausweisen der Mehrwertsteuer oder Versandkosten, die ab einer bestimmten Rechnungssumme entfallen.
Angesichts der hohen Lehrerdichte im Selfhtml-Forum gibt es die Übereinkunft, anderen nicht die Hausaufgaben zu machen. Auch und erst recht nicht für Fachinformatiker. In Schule oder Uni ist das eigentlich zu komplex für eine Hausaufgabe. Hm…
Rolf
Moin Florian,
Meine Datenbank hat folgende Tabellen:
- TBL_kunden
- TBL_rechnungen
- TBL_artikel
- TBL_warenkorb
Den einzelnen Rechnungen werden mittels Kundennummer 'k_id' Kunden zugeordnet. Anhand von Positionen in der Tabelle Warenkorb wird ersichtlich in welcher Rechnung (r_id) welche Menge (menge) der einzelnen Artikel (a_id) aus der Tabelle TBL_artikel gekauft wird. In der Tabelle TBL_artikel ist hinterlegt, welcher Artikel zu welchem Preis angeboten wird.
Wenn der Preis nachträglich geändert wird, ändert sich demnach auch die Rechnung – nachträglich! In einem statischen Beispiel kann man das ignorieren, in einer echten Anwendung muss das im Design berücksichtigt werden.
Auflistung der Rechnungen anhand r_id:
- Ermittle in der Tabelle 'TBL_kunden' zu wem die eingetragene Kundennummer (k_id) gehört.
- Wähle aus der Tabelle 'TBL_warenkorb' alle Positionen aus, die die gleiche Rechnungs-id 'r_id' haben.
- Suche nun anhand der Artikel-id der Positionen in der Tabelle 'TBL_artikel' den jeweiligen Preis 'preis' aus.
- multipliziere ihn mit der angeforderten Menge 'menge' der Artikel in der Tabelle TBL_warenkorb.
- Summiere diese einzelnen Positionen zu einem Zwischenergebnis, dem noch das veranschlagte Porto aus der TBL_rechnungen hinzugefügt wird.
Gib die Liste aller Rechnungen als Tabelle per php script aus, - mit den Spalten: r_id, kunde, rechnungsdatum, gesamtbetrag.
Das liest sich wie eine (von außen) vorgegebene Aufgabenstellung, eventuell eine Hausaufgabe, wie Rolf vermutet. Das Motto von SELFHTML ist Die Energie des Verstehens, daher werden im Forum Anregungen und Hilfestellungen gegeben, aber keine Aufgaben gelöst.
Was in Deinem Fall vielleicht hilft, ist sich die Tabellen und ihre Beziehungen einmal aufzuzeichnen. Anschließend überlegst Du Dir wie die entsprechenden SELECT
-Statements für die oben genannten Teilabfragen aussehen. Von dort aus kannst Du die Statements und Ergebnismengen nach und nach zusammenführen („joinen“).
Geht das überhaupt über eine JOIN Abfrage mit Rechenoperatoren oder muss ich das irgendwie anders lösen?
SQL bietet die Standard-Rechenoperationen, die dafür nötig sind, z.B.
-- Füge Umsatzsteuer hinzu:
SELECT preis * 1.19 AS brutto_preis FROM TBL_artikel /* WHERE … */;
-- Ziehe festen Rabatt von 1 € (entsprechend 100 Cent) ab:
SELECT preis - 100 AS angebots_preis FROM TBL_artikel /* WHERE … */;
-- Oder: Rabatt auf den Bruttopreis:
SELECT preis * 1.19 - 100 AS brutto_preis FROM TBL_artikel /* WHERE … */;
-- bzw. Rabatt auf den Nettopreis:
SELECT (preis - 100) * 1.19 AS brutto_preis FROM TBL_artikel /* WHERE … */;
Wahrscheinlich sind auch Aggregatfunktionen wie SUM
für Dich interessant.
Viele Grüße
Robert
Hallo, Guten Morgen.
Vielen Dank für eure Antworten! Wie schön, dass ihr euch meinem Anliegen angenommen habt! Lustig, dass es wie eine Hausaufgabe rüberkommt.😂 Ich hatte versucht die Fragestellung für mich und euch verständlich zu machen und bin dabei wohl in einen Schulbuchjargon verfallen sorry!
Die Buchhaltungsanwendung mache ich gerade für einen sehr kleinen fast privaten Verlag. Sie wird dringend gebraucht und die Artikel sind alles Bücher.
Verpackung und Versand wird in der "Rechnung-erstellen-Maske individuell eingegeben, kann also auch 0,00 sein. Mwst ist immer 7%.
Aber der Hinweis, dass sich Preise ja ändern können (obwohl das bei dem Verlag eigentlich nie vorkommt (Buchpreisbindung)) ist doch etwas was dann in Zukunft zu gravierenden Fehlern führen könnte. (danke Robert für diesen wichtigen Hinweis!)
Ich werde wohl doch eine Spalte 'gesamtpreis' in der TBL_rechnungen hinzufügen müssen, in der ich bei der Erstellung die mit php ermittelte Summe eintrage. Die Rechnungen werden via fpdf generiert und ändern sich nicht mehr aber in der Suche nach den Rechnungen wurde gewünscht sie nicht nur anhand der ReNr in der Tabelle identifizieren zu können sondern auch anhand des Rechnungsbetrages.
Super auch die Beispiele der Rechenoperatoren! ich werde sie sicher noch für die weitere Arbeit (Kundenkonto, Bestandliste der Bücher usw.) brauchen.
Vielen Dank nochmal für eure Mühe! Florian