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

ftf50wuq  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(303)

我需要做的是:
在本课程的所有班级调查中,如果问题1的答案大于3,则获取百分比。
我有一个表格,里面有大量的课堂调查数据。问题是,例如gene01,可能有5个不同的学生对它进行了5次调查;所以我有4节课,但有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
;

然后我从桌上拿了一个计算器,做了一个新的总数*100。我不知道要完成这个简单的任务需要使用什么子查询(或者您需要做什么)。我想我遇到的问题是我不知道如何比较同一列的计数。
谢谢大家,很抱歉我是mysql的新手。

iszxjhcz

iszxjhcz1#

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

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的速记。mysql计算该值并返回1表示true,返回0表示false,如果为null则返回null。
这几乎等同于更符合可移植的ansi标准:

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

对空值的处理有区别。
更精确地重写 SUM(s.question1 > 3) 会是

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

对于返回的每一行 SUM() 对骨料进行评估。 1 总是计算为 1 .
可以省略 survey_ID 从选择列表中。通常当我们做一个 GROUP BY foo 我们感兴趣的是哪个结果行与哪个结果行相关联 foo .
问题是如何得到一个“百分比”。我们可以在一个表达式中除法 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 条款。所以这将返回一个整体的总行,这将得到一个整体的百分比(如果我们使用 GROUP BY 以及 WITH ROLLUP ,将添加百分比。很可能这不是我们想要的结果。)

wooyq4lh

wooyq4lh2#

您可以按调查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

相关问题