【问题标题】:Inner join, count and group by to get ratios内连接、计数和分组以获取比率
【发布时间】:2012-12-29 19:22:56
【问题描述】:

我希望这对于知道他们在用 mysql 做什么的人来说是一个简单的问题。

我现在有两张桌子; “任务”和“完成”。

任务:

taskID  |  task_name  |  desciption  |  deadline
1       |  task 1     |  do this     | 2012-08-11
2       |  task 2     |  do that     | 2012-10-11
3       |  task 3     |  do the other| 2012-12-31

完成:

taskID  |  userID  |  status
1       |  24      |  complete
1       |  72      |  complete
1       |  15      |  late
2       |  41      |  complete
2       |  86      |  incomplete
3       |  4       |  incomplete
3       |  19      |  incomplete

我正在尝试在一个查询中检索完成(准时或迟到)每项已超过截止日期的任务的用户比例(如下所示):

taskID  |  task_name  |  description  |  deadline  |  completion_ratio
1       |  task 1     |  do this      | 2012-08-11 |  0.66666
2       |  task 2     |  do that      | 2012-10-11 |  0.5

任务 3 未显示,因为截止日期尚未过去。

以下代码为我提供了两个表的简单连接,并仅选择那些已超过截止日期但我想知道如何获得上面显示的结果的任务。

SELECT task.taskID,task.task_name,task.description,task.deadline,completion.status
  FROM task 
  INNER JOIN completion ON task.taskID=completion.taskID 
  WHERE task.deadline>=CURDATE()

查询结果:

taskID  |  task_name  |  description  |  deadline  |  status
1       |  task 1     |  do this      | 2012-08-11 | complete
1       |  task 1     |  do this      | 2012-08-11 | complete
1       |  task 1     |  do this      | 2012-08-11 | late
2       |  task 2     |  do that      | 2012-10-11 | complete
2       |  task 2     |  do that      | 2012-10-11 | incomplete

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql count group-by inner-join


    【解决方案1】:

    试试这个:

    SELECT
      t.taskID,
      t.task_name,
      t.desciption, 
      t.deadline,
      SUM(CASE WHEN c.status = 'complete' THEN 1 ELSE 0 END) * 1.0 / 
      COUNT(c.status) AS completion_ratio
    FROM tasks t
    INNER JOIN completion c ON t.taskID = c.taskID 
    WHERE t.deadline >= CURDATE()
    GROUP BY   t.taskID,
      t.task_name,
      t.desciption, 
      t.deadline;
    

    SQL Fiddle Demo注意:我修改了小提琴演示中的日期以进行演示。

    这会给你:

    | TASKID | TASK_NAME | DESCIPTION |   DEADLINE | COMPLETION_RATIO |
    -------------------------------------------------------------------
    |      1 |    task 1 |    do this | 2012-12-30 |          0.66667 |
    |      2 |    task 2 |    do that | 2012-12-31 |              0.5 |
    

    【讨论】:

    • @MahmoudGamal 但您没有采用问题中提到的Task deadline
    • @rkp 我修改了截止日期值,因为CURDATE() 只返回任务 3,所以我修改了它以便更好地演示,正如我在回答中提到的那样。如果这是一个问题,我可以在问题中使用相同的数据。毕竟这只是样本数据。
    【解决方案2】:

    根据问题提供的表格数据,也可以在这里查看:

    SELECT T.task_id,
      T.task_name,
      T.description,
      T.deadline,
      SUM( if(C.status = 'complete', 1, 0)) * 1.0 /count(C.status)
    FROM tasks AS T
    INNER JOIN completions AS C ON T.task_id = C.task_id 
    GROUP BY T.task_id
    HAVING T.deadline >= CURDATE()
    

    SQL Fiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2012-09-18
      • 2018-10-14
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多