【问题标题】:SQL query to count total ocurrences of values in one column and relative occurrence in another columnSQL查询以计算一列中值的总出现次数和另一列中的相对出现次数
【发布时间】:2016-07-05 08:56:34
【问题描述】:

这是我的第一篇文章,因此也欢迎对格式/内容进行任何一般性更正。我对 SQL 比较陌生。

假设我有一个从分类评估中收集测试结果的数据库。我知道每次测试的预期结果是什么。我还有一列指示测试是否成功,即返回的预期值与预期值匹配。它看起来像这样:

Expected_Result   Result    Success
   A                  A     True
   A                  B     False
   B                  B     True
   A                  A     True
   B                  A     False

我知道我可以用SELECT Expected_Result, COUNT(Expected_Result) FROM Evaluation_Results GROUP BY Expected_Result 返回每​​个预期类型的​​总出现次数。 我知道如何使用SELECT COUNT(*) FROM Evaluation_Results WHERE Success = 'True' AND Expected_Result = 'A' 计算特定预期结果的错误检测次数

我正在努力将两者结合起来。我希望查询返回所有不同预期结果的列表、每个结果的总数、成功结果的计数以及总数的百分比,如下所示:

Expected_Result     Total   Num_Successful  Success_Rate
A                    3          2             66.67
B                    2          1             50.00

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以使用 CASE 表达式在聚合期间执行条件检查。 case 语句标识一个条件结果。例如,您可以使用:

    select evaluation_result
    , count(*) AS total
    , sum(case when success='true' and result='a' then 1 else 0 end) AS num_successful
    , sum(case when success='true' and result='a' then 1 else 0 end)/count(*) AS success_rate
    from evaluation_results group by evaluation_result;
    

    基本上发生的情况是,您正在计算所有成绩的 count(*),根据条件结果计算 1 或 0 的 sum(),然后执行比率数学。这里不需要加入。 CASE Expression 是一个强大的条件语句,可以以多种方式使用。

    或者要获得更灵活的解决方案,请查看以下内容:

    select evaluation_result
    , count(*) AS total
    , sum(case when success='true' and result=evaluation_result then 1 else 0 end) AS num_successful
    , sum(case when success='true' and result=evaluation_result then 1 else 0 end)/count(*) AS success_rate
    from evaluation_results group by evaluation_result;
    

    【讨论】:

    • 大小写表达式,而不是大小写陈述。
    • 所有行的success_rate返回为0?另外,当 Success 列已经将其与 expected_result 进行比较时,为什么还要使用 result?
    • 接受为答案,但我删除了求和中的 'result=evaluation_result' 子句,并在除法前将总和乘以 100.0 以获得 % 成功率。也许你应该编辑你的答案。谢谢。
    • 很高兴它对您有用 - 成功率以比率的形式返回(这通常是我更喜欢查看百分比的方式)所以我很抱歉省略了它。
    • 你不觉得这很耗时吗?
    【解决方案2】:

    如果表相同,您可以使用自连接。

    SELECT distinct e.Expected_Result, COUNT(Expected_Result), sum(e1.columns name), avg(e1.column name)
    FROM Evaluation_Results e
        left join Evaluation_Results e1 on e1.col=e.col
    GROUP BY e.Expected_Result
    

    【讨论】:

    • 为什么选择 DISTINCT? GROUP BY 不返回重复项。
    【解决方案3】:

    使用这个简单的查询并检查结果..

    select Expected_Result, count(Expected_Result) Total,
    sum(IF ('True' = Success, 1, 0) ) Num_Successful, 
    avg(IF ('True' = Success, 1, 0 )) Success_Rate   
    from Evaluation_Results group by Expected_Result
    

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多