使用group by的Oracle SQL Count

dba5bblo  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(130)

我有两张table
| 个人ID|
| --|
| 1 |
| 2 |
| 3 |
| 项目ID|个人ID|项目有效|
| --|--|--|
| 2 | 1 | 1 |
| 1 | 1 |null|
| 3 | 2 | 1 |
| 4 | 3 |null|
我希望得到一个人拥有的有效项目/项目总数的百分比。
例如,在这种情况下,我想
| 个人ID|百分比|
| --|--|
| 1 |百分之五十|
| 2 |百分百|
| 3 |0%的百分比|
我如何用一个带有子查询的select语句来实现这一点?

nxowjjhe

nxowjjhe1#

也许你甚至不需要第一个表;如果在第二个表中有没有任何行的人(所以你会外部连接这两个表),或者如果你想显示一些额外的数据(名字,...),你可能需要它。
只有第二个表,就不需要子查询了--所有的事情都可以在一个select语句中完成。
样本数据:

SQL> with test (item_id, person_id, item_valid) as
  2    (select 2, 1, 1    from dual union all
  3     select 1, 1, null from dual union all
  4     select 3, 2, 1    from dual union all
  5     select 4, 3, null from dual
  6    )

字符串
查询:条件聚合(sum函数)计算有效项目数;然后除以每人的总行数。

7  select person_id,
  8    sum(case when item_valid = 1 then 1 else 0 end) / count(*) * 100 percentage
  9  from test
 10  group by person_id;

 PERSON_ID PERCENTAGE
---------- ----------
         1         50
         2        100
         3          0

SQL>

2w2cym1i

2w2cym1i2#

您可以在应用百分比之前有条件地计数,例如

SELECT person_id, 100*SUM(NVL(item_valid,0))/ COUNT(*)||'%' AS percentage    
  FROM t
 GROUP BY person_id

字符串
假定 * 无效 * 标记为nullzero
Demo

相关问题