SQL Abfrage
-
Guten Morgen C++ Community,
momemtan hänge ich an einer SQL Abfrage. Programmiertechnisch könnte ich es wohl lösen, aber mit SQL Anweisungen habe ich nicht soviel am Hut und ich weiß nicht wirklich weiter.
"Kurz" zu meinem Problem.
Ich habe eine Tabelle mit Kunden und deren Umsatz im vorherigen Jahr. Jeder Kunde hat eine Kundennummer, welcher in dieser Tabelle mehrmals vorkommt. Zu jedem Eintrag wird angegeben, in welcher Periode dieser Umsatz war. Sieht zum Beispiel so aus:Vorheriges Jahr Kundennummer Periode Umsatz 1 1 10€ 1 2 5€ 1 3 20€ ... 2 1 35€ 2 2 20€ ...
Soweit so gut. Jetzt habe ich eine weitere Tabelle und zwar die, des aktuellen Jahrs. Sieht genau so aus, nur können in dieser Tabelle neue Kunden hinzugekommen sein. Das heißt, eine Kundennummer im aktuellen Jahr, kann im vorherigen Jahr nicht existieren, da zum Beispiel der Kunde erst dieses Jahr angelegt wurde. Genauso umgekehrt könnte in der Tabelle des vorherigen Jahrs Kundennummern sein, welche gelöscht wurden und im aktuellen Jahr nicht mehr existieren.
Dann habe ich noch eine 3. Tabelle, welche wir Kundenstamm nennen, in der die Kundennummer steht und dazu noch eine Vertreternummer und eine Kurzbeschreibung des Kunden. JEDER Kunde, ob im vorherigen Jahr gelöscht oder erst neu in diesem Jahr angelegt, ist dort abgelegt.
Sieht so aus:Kundennummer Vertreter Kurzbeschreibung 1 001 Erste Kundennummer 2 001 Zweite Kundennummer 3 002 Dritte Kundennummer
Jetzt muss ich für jede Periode eines Kunden den Umsatz summieren, sodass das vorherige Beispiel in der neuen Abfrage so aussehen müsste.
Kundennummer Vertreter Umsatz Vorjahr Umsatz Aktuell Kurzbeschreibung 1 001 35€ 50€ Erste Kundennummer 2 001 55€ 60€ Zweite Kundennummmer ...
Wie gesagt, hätte ich zwei Listen statt Datenbanken und eine richtige Programmiersprache, würde ich hier garnicht schreiben, aber SQL zerstört mein Kopf.
Meine Abfrage hat eigentlich auch ganz ok funktioniert, nur ab einer bestimmten Kundennummer, hört die Abfrage auf.
Damit ihr meinen Ansatz sehtSELECT Vorjahr.Kontonummer, Kundenstamm.Vertreter, Kundenstamm.Kurzbezeichnung, AktuellesJahr.Periode, Vorjahr.Umsatz, AktuellesJahr.Umsatz FROM (AktuellesJahr INNER JOIN Vorjahr ON (AktuellesJahr.Kontonummer = Vorjahr.Kontonummer) AND (AktuellesJahr.Periode = Vorjahr.Periode)) INNER JOIN Kundenstamm ON AktuellesJahr.Kontonummer = Kundenstamm.Kundennummer ...
Danach habe ich noch eine WHERE und GROUPBY Klausel, damit ich z.B. angeben kann, dass nur Kunden mit einer Vertreternummer in einem bestimmten Bereich angezeigt werden. Daran liegt es nicht, schon getestet.
In dem Beispiel habe ich jetzt ein Inner Join, da ich z.B. bei einem Left Join dann fehlende Kundennummern in der linken Tabelle, welche aber in der rechten neu sind, nicht bekomme.Ich wäre über Hilfe und Denkanstöße erfreut.
Mit freundlichen Grüßen,
freaky
-
freaky schrieb:
Guten Morgen C++ Community,
momemtan hänge ich an einer SQL Abfrage.
No, würd ich sagen, wäre das Datenbanken Unterforum was für dich.
-
Oh, gibt es das schon länger? Ist mir nie ins Auge gesprungen. Sieht aber auch so aus, als wäre das Unterforum nicht so aktiv.
Mein Fehler, bitte verschieben dann.
-
Ist hier echt das selbe Datum in verschiedenen Tabellen einmal mit Feldname "Kontonummer" und einmal mit Fledname "Kundennummer" erfasst? Das ist ja verwirrend...
Die Abfrage selbst sieht recht einfach aus, bin aber grad aufm Sprung, und GANZ ohne nachdenken kann ich die auch nicht hinschreiben. Melde mich dann nochmals...
ps: Ja, das DB Forum gibts schon ewig, und ja, es ist leider wirklich fast nix lost dort.
-
Ja das ist richtig. Die Tabellen habe nicht ich angelegt, das gleiche habe ich mir auch gedacht. Kundennummer ist aber gleich Kontonummer.
-
Hallo,
wenn du alle Kunden aus Kundenstamm erwischen willst, dann mach doch einen Left Join darauf.
-
Servus Community,
danke für deinen Vorschlag Jockelx.
Ich habe mein Problem gelöst. Ich habe jeweils auf beide Tabellen eine Abfrage gemacht und die Umsätze summiert. Somit hatte ich nur noch eine Kundennummer mit einem Summenumsatz.
Dann habe ich ein LEFT JOIN auf die Kundenstamm Tabelle mit jeweils der Abfrage gemacht.
Scheint doch simpler gewesen zu sein, als gedacht.Mit freundlichen Grüßen,
freaky
-
Oops, auf den Thread hatte ich ganz vergessen.
In diesem Fall sind mMn. Sub-Selects angebracht. Weil ich der Meinung bin dass der Code damit am einfachsten/schnellsten zu verstehen ist.
SELECT k.*, ISNULL((SELECT SUM(Umsatz) FROM Vorjahr AS v WHERE v.Kontonummer = k.Kundennummer), 0) AS [Umsatz Vorjahr], ISNULL((SELECT SUM(Umsatz) FROM AktuellesJahr AS a WHERE a.Kontonummer = k.Kundennummer), 0) AS [Umsatz Aktuell] FROM Kundenstamm AS k ORDER BY k.Kundennummer ASC
Das sieht zwar "böse" aus, weil man auf die Idee kommen könnte dass SQL Server hier für jeden Kunden die beiden Sub-Selects extra ausführen müsste.
Tut er aber nicht, der Query-Optimizer von SQL Server verwendelt das intern brav in einen JOIN.
Wer ein Angsthase bzw. sehr vorsichtig ist (bzw. mir einfach nicht glaubt) kann sich ja den Execution-Plan ansehen