2010-05-26 37 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;