2013-06-12 7 views
7

値の範囲内のレコードを数える必要があります。例えばMySQL - グループ別

0-10 -> 3 
10-20 -> 0 
20-30 -> 1 
30-40 -> 2 
1010-1020 -> 1 

これは正常に動作します:セットのため1, 7, 9, 23, 33, 35, 1017

select count(myvalue) group by round(myvalue/10)は次のようなものを提供します。しかし、私は上限を設定する必要がありますので、MySQLは40+ --> 1を返しますか? これはどのように達成できますか?

答えて

12

あなたは、クライアント側の値を合計またはデータをフェッチするために、おそらくunionで、2つのクエリを使用して、例えば次のいずれかです。

select round(myvalue/10), count(myvalue) from table where myvalue < 40 group by round(myvalue/10) 
union 
select '40+', count(myvalue) from table where myvalue >= 40 

単一でそれを書くことが絶対的に可能ですサブクエリや複雑な条件でクエリを実行できますが、シンプルで保守的ではありません。

+0

これは、一般的な方法でクエリを実行する上下限(たとえば20-/40+)を定義する方法であると考えました。 – thelost

3
select t.myvalue as [range], count(*) as [occurences] 
from (
    select myvalue, 
    case when myvalue >= 0 and myvalue< 10 then '0-9' 
    when myvalue >= 10 and myvalue< 20 then '10-19' 
    when myvalue >= 20 and myvalue< 20 then '20-29' 
    when myvalue >= 30 and myvalue< 40 then '30-39' 
    else '40+' end as range 
from t) t 
group by t.myvalue 
+0

それはすべてのアイデアを働いていませんでしたか? 、範囲としてt.salary選択 FROM num_employeeとして(*)カウント(給与を選択 CASE WHEN給与<= 50000 THEN '最低' WHEN給与> 50000及び給与<= 70000 THEN '中' ELSE '最高' END AS RANGE FROM employee_salary)t GROUP BY t.salary – atjoshi

2

私はpilsetnieksとJayramのソリューションの両方から借りて、このソリューションをお勧めします:

SELECT 
    COUNT(*) AS cnt, 
    IF (myvalue >= 40; -1; ROUND(myvalue/10) AS range 
FROM t 
GROUP BY range 
+0

少なくともMySQLでは、 'range'は予約語です:[9.3予約語](http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html) – berliner

0
SELECT case 
    when myvalue >= 0 and myvalue< 10 then '0-9' 
    when myvalue >= 10 and myvalue< 20 then '10-19' 
    when myvalue >= 20 and myvalue< 20 then '20-29' 
    when myvalue >= 30 and myvalue< 40 then '30-39' 
    else '40+' 
    end as range 
from t 
group by range 
+1

これは役に立ちますあなたの答えを編集し、それをMySQLの文脈に入れることができたら、OPです。 – minocha