【问题标题】:Calculate correct percentage for each day计算每天的正确百分比
【发布时间】:2016-02-08 07:23:14
【问题描述】:

我有一张名为tbl_answer 的表。它为每个用户每天回答问题时保存记录。

这是表格的示例。

id    date                      correct    user_id   question_id
1     2015-11-17 06:13:17       yes        11        1
2     2015-11-17 06:24:54       no         1         19
3     2015-11-18 02:09:13       no         129       88
4     2015-11-18 03:16:18       yes        12        98
5     2015-11-20 04:21:24       no         117       4
5     2015-11-20 04:29:24       yes        15        9
....
....
etc

有很多记录。在同一天,许多用户回答了很多问题。因此,某天的记录会以另一个不同的值重复。

现在,我想计算每天正确答案的总百分比。而且我不想显示H:m:i。

所以,我试试这个查询,

SELECT DATE(date) as date,
        ( ( select COUNT(case when correct='yes' then 1 END) )*100 / (count(DATE(date))) ) as percent 
FROM tbl_answer 
GROUP BY date 

之后,我得到了这个结果。

所以,我需要将同一天的这些不同百分比相加。

例如, 如果有 113 个问题在 2015-11-24 和 正确的问题只有 72。因此,2015-11-24 的正确率是 63.71%。

所以,我尝试这样的查询,

SELECT temp.date, SUM(temp.percent) AS total_percent 
FROM (  SELECT DATE(date) as date,
        ( ( select COUNT(case when correct='yes' then 1 END) )*100 / ( count(DATE(date))) ) as percent 
        FROM tbl_answer 
        GROUP BY date
    ) AS temp
GROUP BY temp.date

但是,我得到这样的错误结果,

我认为(count(DATE(date))) 不起作用。我试着用(count(DATE(date))) 计算每天有多少问题,但我不确定为什么它不起作用。

但现在,它只显示7200.0。我已经分了7200/(count(DATE(date)))。但我不知道为什么它不起作用。

【问题讨论】:

  • 为什么需要最外层的选择查询?
  • 我在同一日期有相同的不同百分比。所以,我使用最外层查询来计算当天的百分比
  • 如何获得相同日期的不同百分比?我可以看到您按日期分组,因此不会找到同一日期的重复记录。
  • 你能试试这个查询吗? SELECT DATE(date) as date, ROUND(AVG(CASE WHEN correct='yes' then 1 ELSE 0 END) * 100.0,2) correctPercentage FROM tbl_answer GROUP BY date
  • 当我按照你说的那样尝试时,我得到的百分比是第一张图片。我需要在同一天总结这些不同的百分比。我合并您的查询和我最外层的查询,结果与第二张图片相同。请帮帮我。

标签: mysql


【解决方案1】:

您的查询中有一些不必要的group by。我认为这不会导致正确的输出。所以我采用以下查询。

由于您想要正确答案的日期百分比,因此以下查询可能适合您的需要。

为了测试查询,我创建了下表:

CREATE TABLE `tbl_answer` (
`ID`  int(11) NOT NULL AUTO_INCREMENT ,
`date`  timestamp NULL DEFAULT NULL ,
`correct`  char(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);

查询:

SELECT 
DATE_FORMAT(date,"%Y-%m-%d") `date`,
ROUND(SUM(CASE WHEN correct = 'yes' THEN 1 ELSE 0 END) / COUNT(*) * 100.0, 2) correctPercentage       
FROM tbl_answer 
GROUP BY DATE_FORMAT(date,"%Y-%m-%d")

一些示例数据:

INSERT INTO `tbl_answer` VALUES ('1', '2016-02-08 00:00:00', 'yes');
INSERT INTO `tbl_answer` VALUES ('2', '2016-02-08 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('3', '2016-02-08 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('4', '2016-02-08 00:00:00', 'yes');
INSERT INTO `tbl_answer` VALUES ('5', '2016-02-08 00:00:00', 'yes');
INSERT INTO `tbl_answer` VALUES ('6', '2016-02-02 00:00:00', 'yes');
INSERT INTO `tbl_answer` VALUES ('7', '2016-02-02 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('8', '2016-02-02 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('9', '2016-02-02 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('10', '2016-02-08 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('11', '2016-02-08 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('12', '2016-02-07 00:00:00', 'no');
INSERT INTO `tbl_answer` VALUES ('13', '2016-02-07 00:00:00', 'yes');
INSERT INTO `tbl_answer` VALUES ('14', '2016-02-07 00:00:00', 'no');

表tbl_answer 与这些数据的样子:

输出:

输出解释:

  • 2016-02-08 日期共有 7 个条目,其中 3 个是正确的。 (3/7 = 42.86)
  • 2016-02-02 日期共有 4 个条目,其中 1 个是正确的。 (1/4 = 25.00)
  • 2016-02-07 日期共有 3 个条目,其中 1 个是正确的。 (1/3 = 33.33)

【讨论】:

  • 现在,我在我的问题中添加更多解释。在我的表中,我使用timestamp 作为日期。请帮帮我。
  • 现在,我在我的问题中添加了更多解释。在我的表中,我使用timestamp 作为日期。当我按照你说的那样尝试时,我得到的结果就像你的第一个输入样本数据一样。我认为这是因为我表中的日期为timestamp。请帮帮我。
  • 我已经根据timestamp 数据类型修改了我的查询。请立即查看@NightMare
  • 非常感谢。现在我知道了。 :)
猜你喜欢
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2017-11-12
  • 2016-05-14
  • 2021-03-18
相关资源
最近更新 更多