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 seht

    SELECT 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 😉


Anmelden zum Antworten