基于其他列SUM(DISTINCT)(SUM(DISTINCT) Based on Other Co

2019-06-26 16:53发布

我现在有一个表,看起来是这样的:

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

我需要做的就是在SUM率列,但只有一次每个名称。 例如,我有名字李四的三排,每8.率我需要的SUM那些行的是8,而不是24,所以每个组名的一次计数率。

SUM(DISTINCT last_name, first_name)是行不通的,当然,因为我试图总结率列,而不是名称。 我知道统计单个记录时,我可以使用COUNT(DISTINCT last_name, first_name)这是行为我试图从获得的类型SUM

我怎样才能得到公正SUM为每名一个速度?

提前致谢!

Answer 1:

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


Answer 2:

大卫说,他发现他的回答是这样的:

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”总是使我们相同的“速度”,甚至当它发生多次在表中。 这似乎是大卫的原始假设 - 即一个独特的名字,我们要抢速度只有一次,因为我们知道这将是相同的。



Answer 3:

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


Answer 4:

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


Answer 5:

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



Answer 6:

您可以通过您正在总结不同的值做到这一点。 这是可能的,但非常非常难看

首先,你可以通过一个散列把字符串转换成一个数字。 下面的SQL做的第一和最后一个名字,它返回32个十六进制数字的MD5哈希值。 SUBSTRING采取的这些第一8,和CONV接通该成10位数字(它理论上是可能的,这将不是唯一的):

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

然后你除以一个非常大的数字,并将其添加到率。 你可以看到类似8.0000019351087950的速度结束了。 你必须使用的格式,以避免MySQL的截断小数。 这个比率现在将为每个名字和姓氏独特。

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

然后,如果你这样做了SUM DISTINCT了它只能算一次8。 然后,你需要FLOOR结果除掉多余的小数位:

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

我发现这种方法虽然做了更复杂的查询其加盟并分组几个表。 我仍然不知道我是否会使用它,因为它是相当可怕的,但它确实工作。 这也是6年太晚而没有任何用途,以谁回答这个问题的人的。



文章来源: SUM(DISTINCT) Based on Other Columns