0

我有一个如下表:

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

我需要计算字母 A 有数字 12 的 id 的数量。这很简单,我明白了。但现在我需要计算 id 的字母 A 有一个数字 1一个数字 2,等等。然后每个字母都一样。所以我会得到:

letter count
A          3
C          2

我不在乎 B,因为计数是 1。谢谢。

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 回答