2010-07-13 75 views
3

我有一个sql语句是这样的:由/ distinct和sum组合?

select a.id, a.valfrom ... 
    inner join ... 
    where ...; 

因此,我有这样的:

id val 
--------- 
3  10 
3  10 
3  10 
9  21 
9  21 
11  2 
11  2 
13  30 

所以你可以看到,一个ID都有一个值。

如果我通过(a.id)做一组,我得到:

id val 
--------- 
3  10 
9  21 
11  2 
13  30 

我想最后的结果是总和: 10 + 21 + 2 + 30 = 63。

那么我怎样才能得到的总和作为一个单一的结果? 如果我做一个总和(a.val)和使用组(a.id)我没有得到63,我得到每个id的总和,例如id = 3 - > 10 + 10 + 10 = 30.

最好的问候。

回答

8

然后,您不需要GROUP BY。您也无法在标准SQL中正确选择ID。你只是想:

SELECT SUM(val) FROM (SELECT DISTINCT id, val FROM ...) AS foo

不过,MySQL支持的几个扩展到标准的SQL语法这可能使这项工作:

SELECT DISTINCT id, SUM(val) FROM ...

+0

从select equals选择“boooooo”。 分组方式是一种方式,但它们都有一些共同点:'NULL'。看到我的回答 – 2010-07-13 13:34:41

+0

我这样做,我得到的错误消息: “每个派生表必须有自己的别名” – Tim 2010-07-13 13:37:01

+0

@Tim:编辑,简单修复 – Borealid 2010-07-13 13:39:32

0

使用子查询和独特的:

select sum(valform) from (
    select distinct a.id, a.valfrom ... 
    inner join ... 
    where ... 
) 

或使用分组方式:

select sum(valform) from (
    select a.id, min(a.valfrom) 
    inner join ... 
    where ... 
    group by a.id 
) 

但我估计第一个查询会更快。 “按组”

select sum(distinct a.valfrom) 
    inner join ... 
    where ...; 

没有手了:

+1

在技术上,在标准SQL中,如果内存服务正确,您必须对所有不是聚合的列进行GROUP ...但由于某些原因,MySQL并未强制实施限制。 – Borealid 2010-07-13 13:33:02

+0

没有分组,我得到的结果,你可以在我的第一篇文章中看到。这不是我想要的结果。 – Tim 2010-07-13 13:34:31

+0

是的,我首先误解了你的问题,看到新的解决方案。 – 2010-07-13 13:36:00

0

这将这样的伎俩:)

select a.id, a.valfrom, SUM(val) as mySum ... 
    inner join ... 
    where ... 
GROUP BY NULL 
+1

如果两个不同的ID具有相同的值,该怎么办? – Borealid 2010-07-13 13:36:58

+0

这与Borealid的DISTINCT示例结果相同,但不太清楚。 – 2010-07-13 17:59:56

0

如果查询是

select a.id, a.valfrom ... 
    inner join ... 
    where ...; 

尝试。

-1

您只需使用您必须进行求和的Distinct。

select ID,Sum(Distinct Val) 
from Table 
Group By ID;