簡體   English   中英

在 SQL 中,如果組中的任何行符合特定條件,您如何計算?

[英]In SQL, how do you count if any rows in a group match a certain criteria?

我是 SQL 的新手,但我有一個包含學生、他們的 class 科目以及他們的工作是否有錯誤的數據集。 我想知道有多少學生在任何科目中至少有 1 個錯誤。 因此,無論學生的一門科目有錯誤(如示例中的學生 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    

以及所需的 output:

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_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;

Output:

錯誤 數數 百分
是的 3 0.75
1 0.25

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM