Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
SUM()/Inner Join Proble [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
SUM()/Inner Join Proble


 
KRIZ
10-11-2003, 10:15 
 
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:


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:


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

 
mrhappiness
10-11-2003, 10:18 
 
mach das mal richtig mit JOINs und nicht mit nem WHERE, gibt ein sticky topic dazu

 
Abraxax
10-11-2003, 10:18 
 
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. :goth:

happy :beer: Abraxax

 
KRIZ
10-11-2003, 10:38 
 
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

 
mrhappiness
10-11-2003, 10:43 
 
mach mal pvkb raus, stimmt dann der wert für "heute" ?

 
KRIZ
10-11-2003, 10:44 
 
Mann seit Ihr schnell! :)
Ja, dann stimmt das Ergebniss!

 
mrhappiness
10-11-2003, 10:47 
 
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.produktnrprobier das mal aus

 
KRIZ
10-11-2003, 10:56 
 
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?

 
mrhappiness
10-11-2003, 10:59 
 
und mit der fehlenden 9?

 
KRIZ
10-11-2003, 12:10 
 
Wie gesagt,
mit der fehlenden 9 liefert er das richtige Ergebniss:


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.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:59 Uhr.