2

特定の値のセットが持つ行のパーセンテージを取得しようとしています。例によって最もよく説明されます。これは、ratio-to-report関数とover()を使用して非常に簡単に各列で実行できますが、複数のグループ化に問題があります。

テーブルに2つの列があると仮定します。

column a         column b
1000             some data
1100             some data
2000             some data
1400             some data
1500             some data

次のクエリで、このドメインセットを取得できます。各ドメインセットは、合計行の20%です。

select columna, count(*), trunc(ratio_to_report(count(columna)) over() * 100, 2) as perc
from table
group by columna
order by perc desc;

ただし、必要なのは、たとえば、1000、1400、または2000を含む行のパーセンテージと数を決定することです。それを見ると、その60%がわかりますが、それを返すにはクエリが必要です。クエリは数百万行に対して実行されるため、これは効率的である必要があります。前に言ったように、私はこれを単一の値とそのパーセンテージに取り組んでいますが、複数が私を投げています。

IN句をどこかに配置できるようにする必要があるようですが、値は毎回これらの特定の値になるわけではありません。それが理にかなっている場合は、別のテーブルからその「IN」部分の値を取得する必要があります。ある種の複数のグループ化が必要だと思います。

4

2 に答える 2

1

潜在的に、あなたは次のようなものを探しています

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 1000 a from dual
  3    union all
  4    select 1100 from dual
  5    union all
  6    select 1400 from dual
  7    union all
  8    select 1500 from dual
  9    union all
 10    select 2000 from dual
 11  )
 12  select (case when a in (1000,1400,1500)
 13               then 1
 14               else 0
 15           end) bucket,
 16         count(*),
 17         ratio_to_report(count(*)) over ()
 18    from x
 19   group by (case when a in (1000,1400,1500)
 20               then 1
 21               else 0
 22*          end)
SQL> /

    BUCKET   COUNT(*) RATIO_TO_REPORT(COUNT(*))OVER()
---------- ---------- -------------------------------
         1          3                              .6
         0          2                              .4
于 2011-03-11T18:53:32.770 に答える
0

要件を完全に理解しているのかわかりませんが、必要ratio_to_reportですか?以下をご覧になり、これがあなたの望むものにどれだけ近いかを教えてください。そこから作業できます。

T1は、サンプルデータを含むテーブルです。

create table t1(a primary key) as
   select 1000 as a from dual union all
   select 1100 as a from dual union all
   select 1400 as a from dual union all
   select 1500 as a from dual union all
   select 2000 as a from dual;

T2は、あなたが言及したルックアップテーブルです(IDのリストを取得します)

create table t2(a primary key) as
   select 1000 as a from dual union all
   select 1400 as a from dual union all
   select 2000 as a from dual;

T1-> T2からの左結合は、T1のすべての行を、T2の一致するすべての行とペアにして返します。セット(T2)に存在しないT1の各Aについて、結果はNULLで埋められます。COUNT()nullをカウントしないという事実を利用することができます。

select count(t1.a) as num_rows
      ,count(t2.a) as in_set
      ,count(t2.a) / count(t1.a) as shr_in_set
  from t1
  left 
  join t2 on(t1.a = t2.a);

クエリを実行した結果は次のとおりです。

  NUM_ROWS     IN_SET SHR_IN_SET
---------- ---------- ----------
         5          3         ,6
于 2011-03-11T22:19:08.990 に答える