SUM()/Inner Join Proble

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SUM()/Inner Join Proble

    Hallo,
    ich habe da ein ziemlich seltsames Problem mit einer SQL Anweisung
    inkl. SUM() Funktion.
    Hier erstmal die Datenbankstruktur:

    Ich habe eine Tabelle mit Produkten:
    - ProduktID (Primary Key)
    - ProduktNr (nicht eindeutig, daher kein Primary Key)
    - snr (Foreign Key, eindeutige Nummer der 'Verkaufsstelle')
    - akt_preis

    zusätzlich die Tabelle Produkt_verkauf
    - ID (Primary Key)
    - ProduktID (Foreign Key)
    - anzahl
    - Verkaufspreis
    - Datum

    Sinn des ganzen ist, denn Verkauf jedes Produktes chronologisch nach Datum abzulegen.

    Nun möchte ich zu jedem Produkt, der 'Verkaufsstelle' 1260296
    die Summe aller Verkäufe des aktuellen Tages, sowie die Gesamtverkäufe selektieren. Zusätzlich, die ProduktNr(t2) und den aktuellen Preis(t1).
    Grupiert nach der Produktnummer.

    Daraus ergab Sich nach meinem SQL Verständnis folgende Anweisung:



    select P.ProduktID ,P.ProduktNr , P.akt_preis,
    SUM(PVKa.anzahl) as anzahl_heute,
    SUM(PVKb.anzahl) as anzahl_gesamt
    from Verkaufsstelle V, Produkt P ,Produkt_verkauf PVKa ,
    Produkt_verkauf PVKb
    where V.snr=P.snr
    and V.snr=1260296
    and PVKa.datum >='1064959200' #Aktuelles Datum als Timestamp
    and PVKa.datum <='1068245999'
    and P.ProduktID =PVKa.ProduktID
    and P.ProduktID =PVKb.ProduktID
    group by P.ProduktNr


    Das richtige Ergebniss sollte z.b. folgendermassen aussehen:

    Code:
    ID        ProduktNR             preis             anzahl_heute       anzahl_gesamt
    1               10                     300                       8                            8
    2               11                     320                       20                         20
    3               12                     320                       40                         40
    ...
    als Ausgabe bekomme ich aber:

    Code:
    ID        ProduktNR             preis             anzahl_heute       anzahl_gesamt
    1               10                     300                       88                            88
    2               11                     320                       220                         220
    3               12                     320                       440                         440
    ...
    D.H. Mysql scheint aus welchen Gründen auch immer die erste Zahl der Summen nochmal vor die Summe zu schreiben(aus 8 wird 88, aus 20-> 220,usw.)

    Was mach ich hier falsch? Oder liegt das an Mysql???

    Wäre super, wenn Ihr mir helfen könntet!

    Danke
    gruss

  • #2
    mach das mal richtig mit JOINs und nicht mit nem WHERE, gibt ein sticky topic dazu
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      baue mal deine sql-query um, sodass du auch einen korrekten JOIN verwendest. das aufzählen der tabellen nach dem FROM ist nicht gerade sehr vortrefflich.

      auch hast du nur zwei tabellen beschrieben, aber vier in der query verwendet.

      EDIT:
      happy Abraxax
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        Wow, das ging echt fix!! erstmal Dankeschön!

        Ich fand diesen Aufbau immer etwas verwirrend, deshalb habe ich mir angewöhnt, alle Joins in die WHERE Klausel zu schreiben.
        Bin davon ausgegangen, das die Ergebnisse davon nicht beeinflusst werden.

        Also, habs mal umgestrickt:
        (Ich hoffe Die JOINS sind so alle richtig gesetzt, wie gesagt, benutze ich nicht besonderst oft!)

        select P.ProduktID ,P.ProduktNr , P.akt_preis,
        SUM(PVKa.anzahl) as anzahl_heute,
        SUM(PVKb.anzahl) as anzahl_gesamt
        from Verkaufsstelle V RIGHT JOIN Produkt P ON V.snr=P.snr
        LEFT JOIN Produkt_verkauf PVKa ON P.ProduktID =P.ProduktID
        LEFT JOIN Produkt_verkauf PVKb ON P.ProduktID =PVKb .ProduktID
        where V.snr=1260296
        and PVKa.datum >='1064959200' #Aktuelles Datum als Timestamp
        and PVKa.datum <='1068245999'
        group by P.ProduktNr


        Zur Tabellenbeschreibung, Tabelle Produkt und produkt_verkauf, sind denke ich klar?!
        Tabelle Verkausstelle, ist hier denke ich irrelevant, mann muss lediglich wissen, das die snr dort PK ist. Ansonsten sind dort für diese Anwesung keine wichtigen Daten vorhanden.

        @ Abraxax
        es sind ja eigentlich nur 3 Tabellen, die Tabelle produkt_verkauf wird nur zweimal abgefragt, da ich ja zwei verschiedene Summen bilden will, welche beide in dieser Tabelle vorhanden sind!

        Achso, das Ergebniss der Anweisung ist übrigens das gleiche!!!!
        Danke
        u gruss

        Kommentar


        • #5
          mach mal pvkb raus, stimmt dann der wert für "heute" ?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Mann seit Ihr schnell!
            Ja, dann stimmt das Ergebniss!

            Kommentar


            • #7
              Code:
              SELECT 
              	p.produktid, p.produktnr, p.akt_preis,
              	SUM(h.anzahl) AS anzahl_heute,
              	SUM(g.anzahl) AS anzahl_gesamt
              FROM
              	produkt p
              	LEFT JOIN verkaufsstelle v ON p.snr=v.snr
              	LEFT JOIN produkt_verkauf h 
              		ON 
              			p.produktid=h.produktid 
              			AND 
              			h.datum BETWEEN 1064959200 AND 106824599
              	LEFT JOIN produkt_verkauf g ON p.produktid=g.produktid
              WHERE
              	v.snr=1260296
              GROUP BY
              	p.produktnr
              probier das mal aus
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Deine Abfrage lieferte teilweise das richtige Ergebniss, allerdings nur,
                weil du beim zweiten Timestamp eine 9 vergessen hast.
                106824599 --> 1068245999

                Somit hatt Anzahl heute null.
                Anzahl Gesamt stimmte, Ergebniss war 8,20,40, genau so wie es sein sollte!

                Iss doch seltsam, oder?

                Kommentar


                • #9
                  und mit der fehlenden 9?
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Wie gesagt,
                    mit der fehlenden 9 liefert er das richtige Ergebniss:

                    Code:
                    ID        ProduktNR             preis             anzahl_heute       anzahl_gesamt
                    1          1                           300                                            8
                    2          2                           320                                            20
                    3          3                           320                                            40
                    anzahl_heute ist jedesmal NULL, da der Zeitraum nicht stimmt.

                    Kommentar

                    Lädt...
                    X