2013-03-13 114 views
9

總和我有拖表:MySQL的加入兩個表計數和從第二個表

經銷商 一些領域和主鍵ID

和 查詢 與以下領域 ID dealer_id 成本

有幾個項目在詢問每個經銷商,我必須數它們並總結成本。現在我只有這個聲明的計數:

SELECT a.*, Count(b.id) as counttotal 
FROM dealers a 
LEFT JOIN inquiries b on a.id=b.dealer_id 
GROUP BY a.id 
ORDER BY name ASC 

但我不知道如何總結每個經銷商表b的成本。任何人都可以幫忙嗎?在此先感謝

+3

風味RDBMS的嗎? – 2013-03-13 14:17:58

+0

對不起 - 數據庫是MySQL – 2013-03-13 14:47:28

回答

12

您就可以使用兩個子查詢:

SELECT a.* 
     , (SELECT Count(b.id) FROM inquiries I1 WHERE I1.dealer_id = a.id) as counttotal 
     , (SELECT SUM(b.cost) FROM inquiries I2 WHERE I2.dealer_id = a.id) as turnover 
FROM dealers a 
ORDER BY name ASC 

或者

SELECT a.* 
    , COALESCE(T.counttotal, 0) as counttotal -- use coalesce or equiv. to turn NULLs to 0 
    , COALESCE(T.turnover, 0) as turnover  -- use coalesce or equiv. to turn NULLs to 0 
FROM dealers a 
LEFT OUTER JOIN (SELECT a.id, Count(b.id) as counttotal, SUM(b.cost) as turnover 
       FROM dealers a1 
       INNER JOIN inquiries b ON a1.id = b.dealer_id 
       GROUP BY a.id) T 
     ON a.id = T.id 
ORDER BY a.name 
+0

第二條語句只給出了根據b行中的行,並且由於某種原因也許不壞。第一個是我正在尋找的東西,並且比僅將總和字段添加到我的陳述中要快得多。謝謝你。 – 2013-03-13 15:18:38

+0

將INNER JOIN修改爲LEFT JOIN以獲取所有內容。 – 2013-03-13 15:21:24

0

只需添加, Sum(b.costs) as costsTotal到您的選擇列表中。

1

如果我理解你的問題,你需要做的就是添加一個SUM()

SELECT a.*, 
    Count(b.id) as counttotal, 
    sum(b.costs) TotalCost 
FROM dealers a 
LEFT JOIN inquiries b on a.id=b.dealer_id 
GROUP BY a.id 
ORDER BY name ASC 

我的建議是使用一個子查詢來獲取countsum

SELECT a.*, 
    b.countTotal, 
    b.TotalCosts 
FROM dealers a 
LEFT JOIN 
(
    select COUNT(ID) countTotal, 
     SUM(costs) TotalCosts, 
     dealer_id 
    from inquiries 
    group by dealer_id 
) b 
    on a.id=b.dealer_id 
ORDER BY name ASC 

我從你原來的查詢中猜測你正在使用MySQL。我建議使用子查詢,因爲MySQL使用GROUP BY的擴展名,允許選擇列表中的項目不被聚合,並且不包含在GROUP BY子句中。但是,這可能會導致意外的結果,因爲MySQL可以選擇返回的值。 (見MySQL Extensions to GROUP BY

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

+0

是的,第一個已經是我第一次嘗試完成了。然而,由於我的第一個表中有錯誤,它失敗了。我再次嘗試使用你的語法,它在搜索錯誤之後起作用。我已經嘗試過第二個版本,它也可以工作,但是它給了我phpmyadmin'... 0 - 14(總共15個,...「,這取決於給出的解釋。據我所知,這只是一種性能增強使用子查詢?謝謝! – 2013-03-13 14:45:27

+0

@Ole_S第二個版本強制應用「GROUP BY」的正確方法。選擇列表中的列應包含在聚合函數或GROUP BY中。 – Taryn 2013-03-13 14:47:37

2
SELECT a.*, COUNT(b.id) AS counttotal, SUM(b.costs) AS total 
FROM dealers AS a 
LEFT JOIN inquiries AS b ON a.id=b.dealer_id 
GROUP BY a.id 
ORDER BY name ASC 
3
SELECT a.*, Sum(b.id) as TotalCost 
FROM dealers a 
LEFT JOIN inquiries b on a.id=b.dealer_id 
GROUP BY a.id 
ORDER BY name ASC 
0

makeing一個子表,與所需的字段,並加入它,而不是完整的表將使事情easyer

選擇一個。*,b.count_total,灣costs_of_table
從經銷商視爲
LEFT JOIN(

SELECT aux.dealer_id,計數(aux.id)AS 'count_total',SUM(aux.costs)AS 'costs_of_table' FROM爲輔助查詢

GROUP BY dealer_id)

爲b ON a.id = b.dealer_id
WHERE(你想要的)
ORDER BY名ASC

遺憾了吧拼寫如有

相關問題