2016-07-06 7 views
0

Ich habe einige Probleme mit dem Ergebnis der Operation SUM, die "Gewicht" innerhalb der Where-Klausel genannt wird. Ich würde deine Hilfe schätzen. Hier ist die Abfrage:Fehler beim Verwenden von SUM Ergebnis in WHERE-Klausel

SELECT o.reference 
    , SUM(od.product_weight * od.product_quantity) weight 
    , SUM(od.total_price_tax_incl) total_paid_products 
    , d.price 
    , o.module 
    , rw.id_range_weight 
    FROM ps_orders o 
    , ps_order_detail od 
    , ps_product p 
    , ps_supplier s 
    , ps_delivery d 
    , ps_address a 
    , ps_state state 
    , ps_range_weight rw 
WHERE o.id_order = od.id_order 
    AND p.id_product = od.product_id 
    AND s.id_supplier = p.id_supplier 
    AND o.id_address_delivery = a.id_address 
    AND a.id_state = state.id_state 
    AND d.id_zone = state.id_zone 
    AND d.id_range_weight = rw.id_range_weight 
    AND rw.delimiter1 <= weight 
    AND weight < rw.delimiter2 
    AND 5 = rw.id_carrier 
    AND p.id_supplier = 1 
    AND YEAR(o.date_upd) = 2016 
    AND MONTH(o.date_upd) = 5 
    AND o.current_state IN(2,3,4,5,15,16) 
    AND o.module IN('paypal','redsys','bankwire') 
GROUP 
    BY o.reference 
ORDER 
    BY o.date_upd DESC 

Der Wert „Gewicht“ in die WHERE-Klausel nicht die Summe Ergebnis hat, wird der Wert 0 immer ... wenn ich Gewicht ersetzen für eine Reihe es perfekt funktioniert, Beispiel 10 unter Verwendung von statt Gewicht:

sql result

Danke Jungs für Ihre Zeit!

+0

Also, was ist das Problem? Was funktioniert nicht? Wie funktioniert es nicht? –

+0

Im Allgemeinen sollten nicht aggregierte Spalten in der SELECT-Klausel auch in der GROUP BY-Klausel enthalten sein. Und bitte verwenden Sie keine archaische Joinsyntax. – Strawberry

+0

Hallo @ SamiKuhmonen, das Ergebnis, wenn ich "Gewicht" in der WHERE-Klausel verwenden, ist das gleiche wie wenn ich "0" verwenden, aber Gewicht Wert ist nie 0, muss 10 sein, und 1 ... Ich weiß nicht warum Es behält den SUMME-Wert nicht bei. Was ist falsch mit dieser Syntax @Strawberry? –

Antwort

0

fand ich die Antwort, dank @scaisEdge für diesen

HAVING rw.delimiter1 <= weight AND weight < rw.delimiter2 

und Dank auch dafür, dass ich das nicht wissen @Strawberry Aggregierte Spalten in der SELECT-Klausel sollten ebenfalls in der GROUP BY-Klausel enthalten sein.

Hier ist die vollständige Abfrage

SELECT o.reference 
    , Sum(od.product_weight * od.product_quantity) AS weight 
    , SUM(od.total_price_tax_incl) AS total_paid_products 
    , d.price 
    , o.module 
    , rw.id_range_weight 
    FROM ps_orders o 
    , ps_order_detail od 
    , ps_product p 
    , ps_supplier s 
    , ps_delivery d 
    , ps_address a 
    , ps_state state 
    , ps_range_weight rw 
WHERE o.id_order = od.id_order 
    AND p.id_product = od.product_id 
    AND s.id_supplier = p.id_supplier 
    AND o.id_address_delivery = a.id_address 
    AND a.id_state = state.id_state 
    AND d.id_zone = state.id_zone 
    AND d.id_range_weight = rw.id_range_weight 
    AND 5 = rw.id_carrier 
    AND p.id_supplier = 1 
    AND year(o.date_upd) = 2016 
    AND month(o.date_upd) = 5 
    AND (o.current_state = 2 
     OR o.current_state = 3 
     OR o.current_state = 4 
     OR o.current_state = 5 
     OR o.current_state = 15 
     OR o.current_state = 16) 
    AND (o.module = 'paypal' 
     OR o.module = 'redsys' 
     OR o.module = 'bankwire') 
GROUP 
    BY o.reference 
    , rw.delimiter1 
    , rw.delimiter2 
HAVING rw.delimiter1 <= weight 
    AND weight < rw.delimiter2 
ORDER 
    BY o.date_upd desc 

Danke Jungs für Ihre Zeit.

2

Für Aggregatfunktion Verwendung mit und nicht dort, wo

SELECT o.reference, Sum(od.product_weight * od.product_quantity) as weight, 
SUM(od.total_price_tax_incl) as total_paid_products, d.price, o.module, rw.id_range_weight 

FROM ps_orders o, ps_order_detail od, ps_product p, ps_supplier s, ps_delivery d, 
ps_address a, ps_state state, ps_range_weight rw 

WHERE o.id_order = od.id_order AND p.id_product = od.product_id AND 
s.id_supplier = p.id_supplier AND o.id_address_delivery = a.id_address 
AND a.id_state = state.id_state AND d.id_zone = state.id_zone 
AND d.id_range_weight = rw.id_range_weight 

AND 5 = rw.id_carrier 
AND p.id_supplier = 1 AND year(o.date_upd) = 2016 AND month(o.date_upd) = 5 
AND (o.current_state = 2 OR o.current_state = 3 OR o.current_state = 4 OR 
o.current_state = 5 OR o.current_state = 15 OR o.current_state = 16) 
AND (o.module = 'paypal' OR o.module = 'redsys' OR o.module = 'bankwire') 

GROUP BY o.reference 

HAVING rw.delimiter1 <= weight AND weight < rw.delimiter2 

ORDER BY o.date_upd desc 
+0

Hallo @scaisEdge, danke für die Antwort, aber es gibt mir einen Fehler "Unbekannte Spalte 'rw.delimiter1' in 'Having-Klausel' –