0

次のようなテーブルがあります。

id letter number
1       A      1
2       A      2
3       A      3
4       B      1
5       C      1
6       C      2

文字 A に 1または2の数字が含まれる ID の数を数える必要があります。これは簡単なことです。しかし今、私は文字Aが数字1と数字2などを持っているIDを数える必要があります次に、各文字について同じです。だから私は得るだろう:

letter count
A          3
C          2

カウントは 1 になるので、B は気にしません。ありがとうございます。

4

1 に答える 1

1

分析関数 (PARTITION BY) と GROUP BY を組み合わせて使用​​します。

with v_data as (
select 1 id, 'A' letter, 1 num from dual union all
select 2 id, 'A' letter, 2 num from dual union all
select 3 id, 'A' letter, 3 num from dual union all
select 4 id, 'B' letter, 1 num from dual union all
select 5 id, 'C' letter, 1 num from dual union all
select 6 id, 'C' letter, 2 num from dual
)
select letter, sum(cnt1) as cnt1, sum(cnt2) as cnt2, count(*) cnt_overall from (
select v1.*, 
  sum(case when num = 1 then 1 else 0 end) over (partition by letter) as cnt1, 
  sum(case when num = 2 then 1 else 0 end) over (partition by letter) as cnt2
 from v_data v1
) 
group by letter
having sum(cnt1) > 0 and sum(cnt2) > 0

説明:

  • 内部クエリはすべての行を返し、行の ID の 1 / 2 の出現回数を計算します
  • 外側のクエリは、指定された ID の行数を計算し、値 1 と 2 の両方を持たない ID を取り除きます。
于 2012-08-20T16:00:14.830 に答える