2012-11-19 29 views
1

我正在研究一個mySQL查詢,希望將每個表的小計加起來。在MYSQL中加上小數總和

我有一張會員表。這有他們的名字,一個唯一的ID和其他幾個不相關的物品。另一張桌子是爲了跟蹤他們登錄的社區服務。每個成員都可以多次進入。這些字段是uniqueID(成員的外鍵),auto_increment(主要),術語,小時數和位置。

我想要這個查詢做的是給每個成員的時間加上一個給定的期限的總和。我擁有的是下面的內容,但不幸的是它只給了我第一個成員和每個成員的總數。有任何想法嗎?

SELECT fName, lName, SUM(hours) 
FROM members M, communityService S 
WHERE S.term = 'f2012' && M.onid = S.member 
+0

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**前),其使用是不鼓勵 –

回答

1

你只是缺少一個GROUP BY條款彙總每位fName,lName總和:MySQL之外

SELECT fName, lName, SUM(hours) 
FROM members M, communityService S 
WHERE S.term = 'f2012' && M.onid = S.member 
GROUP BY lName, fName 

大多數RDBMS會報上您的查詢語法錯誤,但MySQL有一個獨特的默認行爲非確定性地選擇一個匹配行來填充聚合中未出現在GROUP BY子句中的其餘列。這就是爲什麼你得到第一行的lName, fName

評論the documentation on aggregate functions and the GROUP BY clause

建議使用明確的INNER JOIN而不是隱式(以逗號分隔的FROM)。

SELECT 
    fName, 
    lName, 
    SUM(hours) AS total_hours 
FROM 
    members M, 
    INNER JOIN communityService S M.onid = S.member 
WHERE 
    S.term = 'f2012' 
GROUP BY lName, fName 
+0

感謝您的幫助!我知道我可能錯過了某種標記。我會確保查看JOIN。 – Jacobm001

1

您需要一個group by子句,例如,

SELECT fName, lName, SUM(hours) 
FROM members 
INNER JOIN communityService ON communityService.member = members.onid 
WHERE communityService.term = 'f2012' 
GROUP BY fName, lName <--- modify as desired for your requirements. 

請注意,我使用現代連接語法重寫了它。您的服務器沒有什麼「錯誤」,但最好在垃圾頭中留下「懶惰」連接語法。

+0

感謝您的幫助。 :) – Jacobm001