2013-05-03 167 views
1

說我GROUP BY a COUNT(*)按特定值分組

COUNT(*)  Value 
3    200 
7    200 
10    20 
15    80 
21    100 
30    200 
33    400 
36    300 
37    100 

我想總結其他所有計數高於30自己的行。

COUNT(*)  Value 
3    200 
7    200 
10    20 
15    80 
21    100 
30    200 
30+    800 

是否有可能實現這一目標沒有一個子查詢/ mysql中查詢數據的兩倍?

謝謝!

編輯:當我的意思是子查詢,我的意思是子查詢在這個意義上,有沒有正在做2「全」的查詢,這一點:

SELECT * FROM(SELECT *...) 

是罰款。

+0

你能提供一個更合理的數據集? – Strawberry 2013-05-07 08:39:54

+0

我認爲數據集對於問題的上下文是足夠的。 – 2013-05-07 10:02:52

回答

2

試試這個,

SELECT CASE WHEN Count > 30 THEN '30+' ELSE Count END `COUNT(*)`, 
     SUM(Value) Value 
FROM TableName 
GROUP BY CASE WHEN Count > 30 THEN '30+' ELSE Count END 
ORDER BY Count 

輸出

╔══════════╦═══════╗ 
║ COUNT(*) ║ VALUE ║ 
╠══════════╬═══════╣ 
║ 3  ║ 200 ║ 
║ 7  ║ 200 ║ 
║ 10  ║ 20 ║ 
║ 15  ║ 80 ║ 
║ 21  ║ 100 ║ 
║ 30  ║ 200 ║ 
║ 30+  ║ 800 ║ 
╚══════════╩═══════╝ 
+0

只有COUNT(*)實際上是一列,或者至少是另一個查詢的結果,而不是相同查詢的COUNT(*)結果,纔會有效。 (假設爲了簡單起見,提問者沒有向我們提供整個查詢,因此他引用了GROUP BY) – 2013-05-03 16:41:09

+1

@TomCannaerts這可以簡單地從'FROM TableName'改變爲'FROM(..subquery計算出一些東西。 ..)' – 2013-05-03 16:44:30

+0

完全是我的觀點。如果沒有子查詢或派生表(如問題所述),則無法執行此操作。 – 2013-05-03 16:47:46

0

你可以在COUNT的結果使用IF()函數,但由於該結果僅當結果集完成時纔可用,這將需要子查詢或至少一個派生表。

SELECT t.somekey, SUM(IF(t.c > 30, 31, t.c)) As Cnt, SUM(t.s) As Value 
FROM (
    SELECT somekey, COUNT(*) c, SUM(value) s 
    FROM sometable 
) as t 
GROUP BY t.somekey 

這樣做的結果是,一切都大於30將被組合在一起,作爲31