我现在有一个表,看起来是这样的:
+------+-------+------------+------------+
| 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
为每名一个速度?
提前致谢!
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
大卫说,他发现他的回答是这样的:
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”总是使我们相同的“速度”,甚至当它发生多次在表中。 这似乎是大卫的原始假设 - 即一个独特的名字,我们要抢速度只有一次,因为我们知道这将是相同的。
SELECT SUM(rate)
FROM [TABLE]
GROUP BY first_name, last_name;
SELECT SUM(rate)
FROM [TABLE]
GROUP BY CONCAT_WS(' ', first_name, last_name);
可以使用任何由子句由于设置有组上述代码示例,而没有任何聚合函数将返回一个不确定的一个记录对每个分组条件。 您可以参考http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html链接进一步阅读。
您可以通过您正在总结不同的值做到这一点。 这是可能的,但非常非常难看 。
首先,你可以通过一个散列把字符串转换成一个数字。 下面的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年太晚而没有任何用途,以谁回答这个问题的人的。