2010-05-26 36 views
21

我有一个帐户表和一个记录表帐户有多个记录。我想通过“记录数”范围来分解帐户总数。即显示的MySQL和CASE WHEN与值范围

Count of Records | Count 
========================= 
0-25 | 100 
25 - 50 | 122 
50 - 100 | 300 

等等

击穿

我使用下面的查询,但我不能用“GRP”,这是我想要的,在最好的方式任何帮助得到它的组修改查询?

SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id 
    ORDER BY ct 

回答

19

试试这个:

SELECT count(*) as ct, 
CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' 
END AS grp 
FROM records r, accounts a 
WHERE r.account_id=a.id 
GROUP BY r.account_id, a.id, 
    CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' END 
ORDER BY count(*) 

你要“定义”中的“桶”你想的原始数据行聚合成...这是在GROUP BY子句是..它定义了分析基表中每一行的标准,以确定数据将被聚合到哪个“桶”...... group by子句中定义的表达式或表达式是这些桶的“定义”。

由于查询处理原始数据行,因此此表达式的值与现有存储桶相同的任何行都会聚合到该存储桶中...任何具有值不为的新行由现有存储桶代表会导致创建新存储桶...

+2

我得到 ERROR 1111(HY000):无效使用组功能的 我使用的MySQL 5.1 谢谢! – kickdaddy 2010-05-26 14:56:32

+0

对不起,因为您在sql查询的主要部分使用了'r.Account_id'和'a.id'这两列,所以您需要将它们包括在组By子句中。每列或表达式都被引用t9o在不属于聚合函数(Sum,Avg,Min,Max等)的查询中的主要(聚合前)部分必须在组By子句中提及。 – 2010-05-26 19:06:12

+0

我看不到如何在GROUP BY子句中使用COUNT(*)。这甚至有可能吗? – 2015-02-11 01:07:24

6

您需要一个子查询。如果这是一个视图,那么你需要使用两个视图。

SELECT s.ct, s.grp FROM ( 
SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 AND COUNT(*) < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 AND COUNT(*) < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 AND COUNT(*) < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 AND COUNT(*) < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 AND COUNT(*) < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id) as s 

Group BY s.grp;