2013-05-03 90 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