我希望这对于那些知道他们用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
非常感谢任何帮助。
答案 0 :(得分:2)
试试这个:
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 |
答案 1 :(得分:1)
根据问题提供的表格数据,请看这里:
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()