web-dev-qa-db-ja.com

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
22
kickdaddy

これを試して:

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句で定義された式は、それらのバケットの「定義」です。

クエリが元のデータ行を処理すると、この式の値が既存のバケットと同じである行は、そのバケットに集約されます...既存の値で表されない値を持つ新しい行バケットにより、新しいバケットが作成されます...

20
Charles Bretana

サブクエリが必要です。これがビューの場合、2つのビューを使用する必要があります。

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;
7
Sajjad Tariq