我目前有一个看起来像这样的表:
+------+-------+------------+------------+
| 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
一个费率?
提前致谢!
答案 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