在SQL中,如何计算组中是否有任何行符合特定条件



我是SQL的新手,但我有一个数据集,里面有学生、他们的课堂主题,以及他们的工作中是否有错误。我想知道有多少学生在任何科目上至少有一个错误。因此,无论学生的一个科目有错误(如本例中的学生2和3(还是多个错误(如学生4(,都会被标记。只有当它们没有错误时,才应将它们归类为"否"。

我知道我必须使用GROUP BY和COUNT,我想我也必须使用HAVING,但我似乎无法将其组合在一起。以下是一个示例数据集:

ID       Rating      Error  
==========================================
1       English    No         
1       Math       No         
2       English    Yes         
2       Math       No         
2       Science    No         
3       English    Yes         
4       English    Yes        
4       Math       Yes    

以及所需的输出:

Error      Count    Percent  
==========================================
No        1        .25
Yes       3        .75         

有很多不同的方法可以做到这一点,这里有一个使用CTE(公共表表达式(的例子:

with t as (
select
id,
case when sum(case when error='Yes' then 1 else 0 end) > 0 then 'Yes' else 'No' end as error
from students
group by id
)
select
error,
count(*),
(0.0 + count(*)) / (select count(*) from t) as perc
from t
group by error

基本上,内部查询(t(用于计算每个学生的错误状态,外部查询计算错误分布/百分比

有几个有用的函数可以使用:

bool_or(boolean) → boolean-如果任何输入值为TRUE,则返回TRUE,否则返回FALSE。if(condition, true_value, false_value)-如果条件为true,则求值并返回true_value,否则求值并返回false_value

select count(distinct id)-计算不同的ID。

with dataset (ID,Rating,Error) as (
values (1,'Math','No'),
(2,'English','Yes'),
(1,'English','No'),
(2,'Math','No'),
(2,'Science','No'),
(3,'English','Yes'),
(4,'English','Yes'),
(4,'Math','Yes')
)
select if(has_error, 'Yes', 'No') Error,
count(*) Count,
cast(count(*) as double) / (select count(distinct id) from dataset) Percent
from (
select bool_or(Error = 'Yes') has_error
from dataset
group by id
)
group by has_error;

输出:

百分比0.75
错误计数
3
10.25

相关内容

  • 没有找到相关文章

最新更新