比较同一列 MySQL 的计数以获得百分比

Comparing Counts of the same column MySQL to get a percentage

我需要做的是:

获取此计划中所有 class 调查中问题 1 的答案大于 3 的百分比。

我有一个 table,其中包含一个巨大的 class 房间调查数据集。问题是,例如,GENE01 可能有 5 名不同学生对它进行了 5 次调查;所以我有 4 classes,但有 50 个调查与之相关。

所以目前,我 运行 两个查询来完成这项任务,但我希望它是一个单一的查询。这是我要合并的两个查询。

-- Query 1
SELECT COUNT(survey_ID) as total 
FROM survey_Table
WHERE courseName LIKE 'GENE01'
   OR courseName LIKE 'GENE02'
   OR courseName LIKE 'GENE03'
   OR courseName LIKE 'GENE04'
GROUP BY survey_ID WITH ROLLUP
; 
-- Query 2
SELECT COUNT (survey_ID) as newTotal
FORM survey_Table
WHERE courseName LIKE 'GENE01' AND question1 > 3
   OR courseName LIKE 'GENE02' AND question1 > 3
   OR courseName LIKE 'GENE03' AND question1 > 3
   OR courseName LIKE 'GENE04' AND question1 > 3
GROUP BY survey_ID WITH ROLLUP
; 

然后我手动从办公桌上拿了一个计算器并计算 newTotal / total * 100。我想不出子查询(或任何你需要做的)来完成这个简单的任务。我想我遇到的问题是我不知道如何比较同一列的计数。

谢谢大家,抱歉我是 MySQL 的新手。

条件聚合是一种可能的方法:

 SELECT s.survey_ID
      , SUM(1)                AS total
      , SUM(s.question1 > 3)  AS newTotal
   FROM survey_Table s
  WHERE s.courseName IN ('GENE01','GENE02','GENE03','GENE04')
  GROUP
     BY s.survey_ID
   WITH ROLLUP

注意条件 s.question1 > 3 是 MySQL shorthand。 MySQL 对其进行评估,returns 1 表示 TRUE,returns 0 表示 FALSE,如果为空则为 NULL。

这几乎等同于符合更便携的 ANSI 标准:

 SUM(CASE WHEN s.question1 > 3 THEN 1 ELSE 0 END)   AS newTotal

不同之处在于处理 NULL 值。

SUM(s.question1 > 3) 更精确的重写是

 SUM(CASE WHEN s.question1 > 3 THEN 1 WHEN s.question1 IS NULL THEN NULL ELSE 0 END)

对于 returned 的每一行,计算 SUM() 聚合中的表达式。 1 始终计算为 1

请随意从 SELECT 列表中省略 survey_ID。通常当我们执行 GROUP BY foo 时,我们感兴趣的是哪个结果行与哪个 foo.

相关联

问题是关于获得 "percentage"。我们可以在 SELECT 列表中的表达式中进行除法。但我认为“with rollup”不会让您如愿以偿。

这是一个例子:

 SELECT SUM(1)                AS total
      , SUM(s.question1 > 3)  AS newTotal

      , 100.0
      * SUM(s.question1 > 3) 
      / SUM(1)                 AS percentage

   FROM survey_Table s
  WHERE s.courseName IN ('GENE01','GENE02','GENE03','GENE04')

在此示例中,我选择省略 GROUP BY 子句。所以这将 return 一个整体总计行,这将使我们得到一个整体百分比。 (如果我们使用 GROUP BYWITH ROLLUP,百分比会被添加。这可能不是我们想要的结果。)

您可以通过 survey_id

加入两个查询
    select t1.survey_ID, t2.newTotal/t1.total 
    from (
    SELECT survey_ID, COUNT (survey_ID) as newTotal
    FORM survey_Table
    WHERE courseName LIKE 'GENE01' AND question1 > 3
       OR courseName LIKE 'GENE02' AND question1 > 3
       OR courseName LIKE 'GENE03' AND question1 > 3
       OR courseName LIKE 'GENE04' AND question1 > 3
    GROUP BY survey_ID ) 
    INNER JOIN (

    SELECT survey_ID, COUNT(survey_ID) as total 
    FROM survey_Table
    WHERE courseName LIKE 'GENE01'
       OR courseName LIKE 'GENE02'
       OR courseName LIKE 'GENE03'
       OR courseName LIKE 'GENE04'
    GROUP BY survey_ID ) t2. ON t1.survey_ID = t2.survey_ID