Announcement

Collapse
No announcement yet.

Left Join Summenbildung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Left Join Summenbildung

    Hallo,

    ich bin kurz vorm Verzweifeln mit einer Abfrage.
    Benötigt werden Kundennummer, Kundenname, Summe Umsatz 2009, Summe Umsatz 2010 und Summe Auftragseingang 2010.

    Sieht bei mir so aus:

    Code:
    SELECT
    	p.KDNR,
    	p.NAME,
    	sum(u1.UMST_POS_NETTO) Umsatz_2009,
    	sum(u2.UMST_POS_NETTO) Umsatz_2010,
    	sum(au.UMSA_POS_WERT) AE_2010
    FROM
    	KUNDEN p,
    	UMSATZ u1,
    	UMSATZ u2,
    	AUFTRAG au
    WHERE
    	    p.KDNR = u1.UMST_KDNR(+)
    	AND u1.UMST_RECH_JAHR(+) = '2009'
    
    	AND p.KDNR = u2.UMST_KDNR(+)
    	AND u2.UMST_RECH_JAHR(+) = '2010'
    
    	AND p.KDNR = au.UMSA_KDNR(+)
    	AND au.UMSA_JAHR(+) = '2010'
    
    	AND exists (SELECT 
    			    vtz.PRTV_MAND_ID 
    	   		FROM 
    			    KUNDEN_VO_ZUORDNUNGEN vtz
    	   		WHERE 
    			    vtz.PRTV_PRT_ID=p.PID AND 
    		    	    vtz.PRTV_VSVO_ID = (SELECT vo.VSVO_ID FROM VS_VERTRETERSTAMM vo WHERE vo.VSVO_KURZNAME='140'))
    GROUP by
    	p.KDNR,
    	p.NAME
    Bei dieser Abfrage erhalte ich völlig utopische Zahlen.
    Frage ich aber nur Kundennummer, Name und Summe Umsatz 2009 ab (also nur eine der drei Summen), funktioniert es einwandfrei.

    Woran liegt das?!

  • #2
    Ich denke das liegt wohl am JOIN. Ein JOIN erzeugt ein kartesisches Produkt. Ein einfacher JOIN kombiniert jede Zeile einer Tabelle mit jeder Zeile einer anderen Tabelle. Wenn du es ganze ohne JOIN Bedingung machst hast Du praktisch n * m Zeilen, wobei n die Anzahl der Zeilen von Tabelle 1 ist, m entsprechend für Tabelle 2.
    Deswegen stimmt das Ergebnis wenn Du nur eine Summe berechnest. Wenn Du jetzt allerdings einen weiter JOIN anfügst werden die Daten wieder multipliziert. Und Du solltest dann ein vielfaches des eigentliches Ergebnisses als Resultat erhalten.
    Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.

    Lösung:
    Teile die verschiedenen Summen in einzelne Abfragen auf.

    Comment


    • #3
      Originally posted by fanderlf View Post
      Lösung:
      Teile die verschiedenen Summen in einzelne Abfragen auf.
      Hallo und danke für deine Antwort.
      Ich habe es bisher immer mit Subqueries gelöst, ist hierbei aber sehr langsam.
      Aber wenn es wirklich keine andere Lösung gibt...

      Comment


      • #4
        Hallo,

        vielleicht hilft dir auch allgemein [wikibooks] Einführung in SQL mit den Kapiteln "Mehrere Tabellen" ff.

        Gruß Jürgen

        Comment


        • #5
          Originally posted by labboo View Post
          Hallo und danke für deine Antwort.
          Ich habe es bisher immer mit Subqueries gelöst, ist hierbei aber sehr langsam.
          Aber wenn es wirklich keine andere Lösung gibt...
          Aber lieber ein langsameres richtiges Query, als ein falsches schnelles

          Evtl. geht es schneller, wenn Du nicht alles in ein Query baust, sondern die einzelnen Summen in separaten Abfragen berechnest. Ausser das ist Programmtechnisch nicht möglich/erwünscht.

          Comment


          • #6
            Allgemeiner Hinweis: Unterabfragen sind fast immer langsamer als geeignete JOINs.

            Ob das wirklich relevant ist, hängt natürlich von der konkreten Situation ab. Im Zweifelsfall hat fanderlf natürlich recht: besser langsam und richtig als schnell und falsch.

            Gruß Jürgen

            Comment

            Working...
            X