2012-12-31 94 views
4

我有一張表,如下所示。在mysql查詢中使用min,max和avg

我想單個查詢中的最小,最大和平均成本產品的product_id。

CREATE TABLE productlist(product_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
         cost INT);        

INSERT INTO productlist(cost) 
       VALUES('2450'), 
         ('2200'), 
         ('2580'), 
         ('2405'), 
         ('3500'), 
         ('1500'), 
         ('1800'), 
         ('1520'), 
         ('1740'), 
         ('1940'), 
         ('2940'), 
         ('1250'), 
         ('1290'), 
         ('1390'), 
         ('2900'); 

輸出:

Min 12 
Max 5 
Avg 2093 

我試着像一個下面,但它不是工作。

SELECT product_id, MIN(cost) as mincost 
    FROM productlist 
GROUP BY product_id 
ORDER BY mincost ASC 
LIMIT 0,1 
UNION 
SELECT product_id, max(cost) as maxcost 
    FROM productlist 
GROUP BY product_id 
ORDER BY maxcost DESC 
LIMIT 0,1 

我應該怎麼做這個

+0

'product_id'設置爲'AUTO_INCREMENT'和'PRIMARY KEY'。因爲沒有'product_Id'是相同的,所以得到每個*'product_id'的min,max,avg *沒有意義。 –

+0

我需要在表格中顯示最大和最小產品成本。唯一的方法是編寫單獨的查詢? – ArrayOutOfBound

+0

avg的產品ID是什麼?如果Avg = 2093,則mysql AVG函數不會返回您的ID – Sahal

回答

1
select 'Min', product_id 
from productlist 
where cost = (select min(cost) from productlist) 
UNION 
select 'Max', product_id 
from productlist 
where cost = (select MAX(cost) from productlist) 
UNION 
select 'Avg', round(AVG(cost),0) as Avg 
from productlist 
+1

不,它永遠不會返回產品ID平均是所有人都可以看到有問題的操作系統 – ArrayOutOfBound

+0

好的非常感謝你 – ArrayOutOfBound

-1

這是選擇所有

SELECT 
      max(cost), MIN(cost), AVG(cost) 
    FROM 
      productlist 
    GROUP BY 
      product_id 

GROUP BY不正是這裏所需要的產品。但似乎你是初學者,谷歌搜索會幫助你。

對於你的問題試試這個。

SELECT 
      (select CONCAT(product_id, '-', cost) from productlist group by product_id order by cost DESC limit 1) as MAX, 
      (select CONCAT(product_id, '-', cost) from productlist group by product_id order by cost ASC limit 1) as MIN, 
      (select avg(cost) from productlist) as AVG 
FROM 
      productlist limit 1 
+0

不僅GROUP BY不是必需的,而且是__wrong__。它只會報告每個產品的成本,而不是所有產品的最小/最大/平均值。 – Barmar

+0

你是對的,缺乏閱讀技巧 – Sahal

+0

立即嘗試。我又添加了一個查詢 – Sahal

0

這完全回答你的問題,但應該指出,它需要3個表掃描才能找到這些數據。另外,問題中的示例表明,平均值爲truncated,從2093.67降至2093。用round代替它可能會更好。

SQL Fiddle

SELECT concat('Min ', product_id) 
    FROM productlist 
WHERE cost = (SELECT min(cost) from productlist) 
UNION ALL 
SELECT concat('Max ', product_id) 
    FROM productlist 
WHERE cost = (SELECT max(cost) from productlist) 
UNION ALL 
SELECT concat('Avg ', truncate(avg(cost), 0)) 
    FROM productlist 
+0

它不返回產品ID – NimChimpsky

+0

我想要產品ID – ArrayOutOfBound

+0

這不是在示例輸出中,所以它不在我的。我會添加它,但通常我會說,如果你想在答案中包括它是一個好主意:) –

1
select product_id, cost 
from productlist where cost = (SELECT max(cost)from productlist) 
union 
select product_id, cost 
from productlist where cost = (SELECT min(cost)from productlist) 
union 
select product_id, cost 
from productlist where cost = (SELECT x.cost from productlist x, productlist y 
GROUP BY x.cost 
HAVING SUM(SIGN(1-SIGN(y.cost-x.cost))) = (COUNT(*)+1)/2) 

這將使用中位數,返回的產品ID在

+0

哇。 Gr8我剛剛檢查你的解決方案真的很好的一個它帶來了最接近的product_Id平均水平,如果我是正確的。 – ArrayOutOfBound

+0

其使用中位數:http://en.wikipedia.org/wiki/Median,這是不同的意思,或模式。他們都是「平均」的類型。 – NimChimpsky

+0

@ mugli如果有幫助,你可以接受答案。 – NimChimpsky

0

你要的是不是你寫的 查詢來的輸出,你需要嘗試每一種情況下這一個獲得所需的輸出

select 'Min', product_id 
from productlist 
where cost = (select min(cost) from productlist) 
UNION 
select 'Max', product_id 
from productlist 
where cost = (select MAX(cost) from productlist) 
UNION 
select 'Avg', floor(AVG(cost)) as Avg 
from productlist