比较同一列 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 BY
和 WITH 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
我需要做的是:
获取此计划中所有 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 BY
和 WITH 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