2012-08-02 305 views
12

我現在有一個表,看起來是這樣的:SUM(DISTINCT)基於其他列

+------+-------+------------+------------+ 
| id | rate | first_name | last_name | 
+------+-------+------------+------------+ 

我需要做的就是速度列SUM,但只有一次,每個名字。例如,我有三行John Doe名字,每行的速率爲8.我需要這些行的SUM爲8,而不是24,因此它爲每組名稱計算一次速率。

SUM(DISTINCT last_name, first_name)不會工作,當然,因爲我試圖總結費率列,而不是名稱。我知道在統計單個記錄時,我可以使用COUNT(DISTINCT last_name, first_name),這就是我想要從SUM獲得的行爲類型。

我怎樣才能得到SUM每個名字的一個費率?

在此先感謝!

回答

8
select sum (rate) 
from yourTable 
group by first_name, last_name 

編輯

如果你想獲得的那些小 「sums」 的所有款項,您將獲得所有表的總和..

Select sum(rate) from YourTable 

但是,如果由於某種原因是不同的(例如,如果您使用where) 並且您需要上述選擇的總和,只需這樣做。

select sum(SumGrouped) from 
( select sum (rate) as 'SumGrouped' 
    from yourTable 
    group by first_name, last_name) T1 
+0

現在,我很抱歉沒有在原始答案中提及這一點:那麼我怎麼能得到所有這些新的SUM的總和呢?我知道我可以在PHP中做到這一點,但是可以在該查詢中獲得結果的SUM? – David 2012-08-02 17:05:03

+0

@David,請參閱我的編輯 – 2012-08-02 17:07:08

+0

第二個查詢會產生沒有任何GROUP BY影響的SUM(rate),我不知道爲什麼。 – David 2012-08-02 17:13:41

1
SELECT SUM(rate) 
FROM [TABLE] 
GROUP BY CONCAT_WS(' ', first_name, last_name); 
+0

出於好奇,你爲什麼使用'CONCAT_WS'? – David 2012-08-02 17:05:29

+2

將第一個和最後一個名稱與分隔符一起分組。如果你想每個姓和每個名字,你會做'GROUP BY last_name,first_name'。這將爲每個姓氏和每個名字提供總和,而不是全名。 – MetalFrog 2012-08-02 17:07:16

+0

非常感謝,這對此應用程序的其他部分非常有幫助:) – David 2012-08-02 17:08:11

2
SELECT SUM(rate) 
FROM [TABLE] 
GROUP BY first_name, last_name; 
0

可以使用任何因爲具有由條款組所提供的上面的代碼示例,而沒有任何聚合函數將返回一個不確定的一個記錄對每個分組條件。您可以參考http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html鏈接進一步閱讀。

+1

特別是由於這個原因,僅鏈接答案是不好的。您的鏈接現在已損壞。 – Buggabill 2016-05-25 18:05:02

5

大衛說,他發現他的回答是這樣的:

SELECT SUM(rate) FROM (SELECT * FROM records GROUP BY last_name, first_name) T1 

但是,當你在內部查詢做GROUP BY,我覺得你有你的SELECT使用聚合函數。所以,我認爲答案是更喜歡:

SELECT SUM(rate) FROM (SELECT MAX(rate) AS rate FROM records GROUP BY last_name, first_name) T1 

我拿起MAX()挑只有一個「速度」爲「姓氏,FIRST_NAME」組合,但MIN()應該工作一樣,假設「姓氏,FIRST_NAME」即使在表格中發生多次時,我們也始終將我們引向相同的「比率」。這似乎是大衛的原始假設 - 對於一個獨特的名字,我們只想要抓住一次價格,因爲我們知道它是一樣的。