2016-04-20 7 views
1

Also lief ich diese kleine Abfrage und ich habe etwas seltsames vor sich.MySQL: AVG-Funktion: Warum gibt die Abfrage einen falschen Wert zurück?

Ich möchte alle Artikel anzeigen, die einen Bestand haben, der größer ist als der durchschnittliche Lagerbestand (wenn das sinnvoll ist ...).

Wenn ich es ausführen, hat eines der Produkte weniger Lager als der berechnete Durchschnitt ... und ich bin mir nicht sicher warum. In diesem Szenario der Rückkehr das Element, das nicht sein sollte, ist: 421

Return Daten:

"sum(quantity_stocked)" "count(product_id)" "avg(quantity_stocked)" 
"15885"     "18"    "882.5000" 


"product_id" "quantity_stocked" 
"861"   "1082" 
"591"   "1948" 
"485"   "1402" 
"421"   "858" 
"277"   "1920" 
"214"   "902" 
"59"   "1021" 

Abfragen:

select sum(quantity_stocked), count(product_id), avg(quantity_stocked) 
FROM products; 

SELECT product_id, quantity_stocked 
FROM products 
WHERE quantity_stocked > (
    SELECT avg(quantity_stocked) 
    FROM products 
    GROUP BY product_id 
    LIMIT 1 
    ); 

Rest Code:

CREATE TABLE products 
(
product_ID    int(10)    UNIQUE, 
product_name   varchar(30)   NOT NULL,   
quantity_stocked  int(5), 
product_cost   dec(8,2)   NOT NULL, 
PRIMARY KEY (product_ID) 
); 

INSERT INTO products VALUES 
(452,'Nike SS Pro Top',418, 22.99), 
(861,'Nike LunarGlide 7',1082, 74.99), 
(453,'Nike LS Pro Top',654, 64.99), 
(454,'Nike SS Pro Top',720, 64.99), 
(451,'Nike Pro Tank',480, 45.99), 
(485,'Nike 5k Run Short',1402, 24.99), 
(582,'Nike Fit Capri',750, 29.99), 
(591,'Nike Be Fast Tight',1948, 39.99), 
(847,'Nike Legend Tee',120, 34.99), 
(277,'Nike Miller v-neck',1920, 44.99), 
(135,'Adidas Soccer Pant',630, 34.99), 
(456,'Adidas SS Breathe Top',754, 19.99), 
(457,'Adidas Pro Cleat',626, 44.99), 
(214,'Adidas Slide',902, 19.99), 
(054,'Underarmor SL Top',854,54.99), 
(059,'Undersarmor LS High Neck',1021,54.99), 
(574,'Underarmor TR Short',746,24.99), 
(421,'Underarmor TR Balance Shoe',858,84.99); 
+0

Es ist so erfrischend, eine Frage zum Debuggen zu sehen, die alle Komponenten an Ort und Stelle hat, um es beantwortbar zu machen! – Shadow

+0

Es ist etwas, an dem ich hart gearbeitet habe, um meine Fragen zu lösen! :) Froh, dass es dort ankommt! – Sierra

Antwort

2

In Ihrer Unterabfrage vergleichen Sie mit Durchschnitt von einer Ihrer Produkte (die in diesem speziellen Beispiel wird # 452 sein, mit quantity_stocked von 418), nicht Durchschnitt von alle Produkte. Entfernen Sie einfach dieses Teil:

+0

Vielen Dank! Das funktioniert so viel besser! :) – Sierra

+0

Wenn ich fragen darf, wie haben Sie gedacht, dass es mit 452 vergleichen würde? Weil es der höchste Wert ist? – Sierra

+0

Wegen LIMIT 1 nimmt es die erste Zeile, die von SELECT abgefangen wird. Und was ist die erste Zeile in Ihrer Tabelle - ich weiß es aus der INSERT-Anweisung, die Sie gaben. – Sych