2010-07-13 60 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;