2009-07-28 27 views
3

我很抱歉,如果這是非常基本的,但:聚合MySQL函數總是返回單行嗎?

我覺得在某些時候我沒有這個問題了,現在的我,所以無論我在做某件事之前完全不同,或者我的語法已經跳過一步。

例如,我有一個查詢,我需要返回具有某些數據的所有行,以及具有其中一列的總數的另一列。如果事情的來龍去脈如我所料他們來說,這看起來像:

SELECT 
order_id, 
cost, 
part_id, 
SUM(cost) AS total 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy 

而且我會得到所有的行用我的命令,與上漲到每一個年末總。我知道每次總數都是一樣的,但這是預期的。現在,我正在使用的工作:

SELECT 
order_id, 
cost, 
part_id, 
(SELECT SUM(cost) 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy) AS total 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy 

基本上運行相同的查詢兩次,一次爲總,一次爲其他數據。但是如果我想要,比如說SUM和我不知道的平均成本,那麼我會做三次相同的查詢,而這看起來確實是錯誤的,這就是爲什麼我認爲我正在做出一些非常基本的錯誤。

任何幫助真的很感激。

+0

看起來你正在得到很好的答案,但是以「是」或「否」的形式表示的問題並不是一個非常有用的開始,恕我直言。 – Smandoli

+0

我傾向於寫出對他們有非常模糊和質的聲音的問題,所以這是我更加精確的嘗試。仍然微調。 – Anthony

回答

6

您需要使用GROUP BY這樣讓你期望的結果:

SELECT 
order_id, 
part_id, 
SUM(cost) AS total 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy 
GROUP BY order_id, part_id 

這將組結果。請注意,由於我假設order_idpart_id是一個複合PK,因此上面的SUM(cost)可能爲= cost(因爲您將兩個字段組合在一起進行分組,以保證它們是唯一的,下面的相關子查詢將克服此限制)。

需要在GROUP BY行中指定取得的任何非聚合行。

欲瞭解更多信息,可以閱讀教程有關GROUP BY這裏:

MySQL Tutorial - Group By


編輯:如果你想使用的列既是骨料和非彙總,或者如果您需要廢止您的羣組,則需要使用子查詢:

SELECT 
or1.order_id, 
or1.cost, 
or1.part_id, 
(
    SELECT SUM(cost) 
    FROM orders or2 
    WHERE or1.order_id = or2.order_id 
    GROUP BY or2.order_id 
) AS total 
FROM orders or1 
WHERE or1.order_date BETWEEN xxx AND yyy 
+0

您按成本分組,因此SUM(成本)不起作用。 –

+0

** @ Rax Olgud:**這是我從原來的'SELECT'複製和粘貼而不檢查字段。錯誤已被糾正。 –

+0

而且您確實擁有編輯權限。沒有必要劫持一個簡單的錯字答案。 –