1

これが、mysqlで何をしているのかを知っている誰かにとって簡単な質問になることを願っています。

現在、2つのテーブルがあります。「タスク」と「完了」。

タスク:

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

締め切り日を過ぎた各タスクを(以下のように)すべて1つのクエリで完了した(時間どおりまたは遅れた)ユーザーの比率を取得しようとしています。

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は表示されません。

次のコードは、2つのテーブルを単純に結合し、期限を過ぎたタスクのみを選択しますが、上記の結果を取得する方法を知りたいと思います。

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

どんな助けでも大歓迎です。

4

2 に答える 2

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注:デモンストレーションのために、fiddle デモの日付を変更しました。

これにより、次のことが得られます。

| 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 |
于 2012-12-29T19:41:13.390 に答える
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()

SQL フィドルのデモ

于 2012-12-29T20:08:07.590 に答える