2017-01-03 6 views
0

いくつかの値の間にデータの出現回数を入れたいと思います。値が1 2 3 4 ....から100までの値を持つ列名を取ることができます。 0〜5の後、10〜15のカウントとすぐに100 所望の出力件まで私はこのようなクエリを書くことで、これを行うことができoracle sqlいくつかの値の間のデータの出現数を問い合わせる

id count(val) 
1 35 
2 12 
3 89 
4 45 
5 12 

のようなものですその後、5〜10のカウント。

select colname, 
     sum(case 
      when val > 0 and val < 5 then 1 else 0 
      end) 
    from tablename 
group by colname. 

カラムの幅が広いため、このタスクでは複数のケースを記述できません。

+0

「0から5まで、5から10まで」 - 最初のセットまたは2番目のカウントはどこでカウントされますか? (または両方で - それを2回カウントしますか?)そして、クエリでは 'val> 0とval <5'を書いています - ここで' 0'と '5'を数えたくないのですか?あなたはあなたの心を補う必要があります。たとえば、 '0'(包括)から '5'(排他)、または 'val> = 0 and val <5'、次に 'val> = 5'および 'val <10'行または列に結果を表示しますか?列内にある場合は、すべての列名を記述する必要はありません(とにかく一般的ではありません)。また、 'val'には下限と上限がありますか? – mathguy

答えて

1

あなたが探しているのはヒストグラムです。あなたの望ましい結果を達成するための一つの方法は、width_bucket()機能である:

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions214.htm

あなたは0の数と間隔の行を生成する必要があるかもしれません - あなたは、例えば、外でに参加、それを行うことができbの値が1から20(以下の表記を使用しています)のすべての値を持つテーブル(その場で簡単に生成できます)。

with 
    test_data (id, val) as (
     select 1, 35 from dual union all 
     select 2, 12 from dual union all 
     select 3, 89 from dual union all 
     select 4, 45 from dual union all 
     select 5, 12 from dual 
    ) 
-- end of test data; solution (SQL query) begins below this line 
select 5 * (b - 1) as int_from, 5 * b as int_to, count(1) as ct 
from  (select width_bucket(val, 0, 100, 20) as b from test_data) 
group by b 
order by b 
; 

    INT_FROM  INT_TO   CT 
---------- ---------- ---------- 
     10   15   2 
     35   40   1 
     45   50   1 
     85   90   1 

4 rows selected. 
+0

thankyou .... width_bucket()関数は私のためのタスクを行った –

関連する問題