SUM(DISTINCT)基于其他列

时间:2012-08-02 16:58:21

标签: mysql math 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一个费率?

提前致谢!

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

大卫说他找到了答案:

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()只选择一个"率"对于" last_name,first_name"组合,但MIN()应该工作相同,假设" last_name,first_name"总是把我们引向同样的"率"即使它在表中多次出现。这似乎是大卫最初的假设 - 对于一个独特的名称,我们只想获取一次,因为我们知道它会是相同的。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以使用上面提供的任何代码示例,因为group by子句没有任何聚合函数,将为每个分组条件返回一个不确定的一条记录。您可以参考http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html链接进一步阅读。

答案 5 :(得分:0)

您可以通过使要累加的值与众不同来实现此目的。这是可能的,但是非常非常丑

首先,您可以通过使用哈希将字符串转换为数字。下面的SQL进行名字和姓氏的MD5哈希,该哈希返回32位十六进制数字。 SUBSTRING接受其中的前8位,然后CONV将其转换为10位数字(从理论上讲,这可能不是唯一的):

CONV(SUBSTRING(MD5(CONCAT(first_name,last_name)), 1, 8), 16, 10)

然后将其除以很大的数字,然后将其添加到费率中。您最终将获得8.0000019351087950的费率。您必须使用FORMAT以避免MySQL截断小数位。现在,每个名字和姓氏的费率都是唯一的。

FORMAT(rate + CONV(SUBSTRING(MD5(CONCAT(first_name,last_name)), 1, 8), 16, 10)/1000000000000000, 16)

然后,如果您对SUM DISTINCT进行求和,则它将仅对8计数一次。然后,您需要查找结果以除去多余的小数位:

FLOOR(SUM(DISTINCT FORMAT(rate + CONV(SUBSTRING(MD5(CONCAT(first_name,last_name)), 1, 8), 16, 10)/1000000000000000, 16)))

我在执行一个更复杂的查询(将多个表组合在一起)时发现了这种方法。我仍然不确定是否会使用它,因为它非常可怕,但是它确实有效。对于回答该问题的人来说也太迟了6年。

答案 6 :(得分:0)

我发现这个线程正在寻找一种更好的方法来解决我的问题,但我仍然没有找到更好的方法:

SELECT SUM(rate) FROM (SELECT DISTINCT rate, first_name, last_name) Q