2012-08-02 247 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”即使在表格中发生多次时,我们也始终将我们引向相同的“比率”。这似乎是大卫的原始假设 - 对于一个独特的名字,我们只想要抓住一次价格,因为我们知道它是一样的。