我是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;
输出:
错误 | 计数 | 百分比|
---|---|---|
是 | 3 | 0.75|
否 | 1 | 0.25 |