4

上級:

私にはチェックリストがあり、チェックリストにはチェックリスト項目があります。完了したチェックリストの数を取得したい。具体的には、チェックリスト項目はあるがすべて完了しているチェックリストです。

テーブル:

Table "checklists"

|     Column   |          Type          |
+--------------+------------------------+
| id           | integer                |
| name         | character varying(255) |

Table "checklist_items"

|     Column   |          Type          |
+--------------+------------------------+
| id           | integer                |
| completed    | boolean                |
| name         | character varying(255) |
| checklist_id | integer                |

質問: 完了したチェックリストの数を確認するには、どのクエリを使用しますか? 具体的には、チェックリスト項目が完了しているものと未完了のものがあるチェックリストと、チェックリスト項目がないチェックリストを除外するように注意してください。

これまでに試した:

SELECT DISTINCT COUNT(DISTINCT "checklists"."id")
  FROM "checklists"
INNER JOIN "checklist_items" ON "checklist_items"."checklist_id" = "checklists"."id"
  WHERE "checklist_items"."completed" = 't'

この質問の問題点は、部分的に完了したチェックリストを除外していないことです。

4

5 に答える 5

4

より速く、さらに:

SELECT count(DISTINCT i.checklist_id)
FROM   checklist_items i
LEFT   JOIN checklist_items i1 ON i1.checklist_id = i2.checklist_id
                              AND i.completed IS NOT TRUE
WHERE i.completed
AND   i1.checklist_id IS NULL;

これは、完了したアイテムが存在するチェックリストのみを収集します。また、完了していない別のチェックリスト項目が存在するもの (または)
を除外します。FALSENULL

于 2013-04-26T19:02:35.297 に答える
2

以下は、サブクエリを使用してこれを行います。

select COUNT(*)
from (select cl.id,
             SUM(case when cli.completed <> 't' or cli.completed is null then 1 else 0 end) as NumIncomplete
      from checklists cl join
           checklist_items cli
           ON cli.checklist_id = cl.id
      group by cl.id
     ) t
where NumIncomplete = 0

サブクエリを実行して、チェック リストごとに未完了の項目がいくつあるかを確認できます。

于 2013-04-26T17:47:08.167 に答える
1

試す:

SELECT COUNT(*)
FROM   (
         SELECT 1
         FROM checklist_items
         GROUP BY checklist_id
         HAVING bool_and(completed)
       ) as sq
于 2013-04-26T17:51:06.763 に答える
0

空のチェックリストは完了したと見なされます (ただし、これを変更して空のチェックリストを削除することもできます)。

SELECT checklists.id 
FROM checklists LEFT JOIN (SELECT DISTINCT checklist_id 
                           FROM checklist_items WHERE completed = 'f') partial_checklists 
                ON checklists.id = partial_checklists.checklist_id 
WHERE partial_checklists.checklist_id = NULL

空のチェックリストを除外するには (ここの構文はよくわかりませんが):

SELECT checklists.id 
FROM checklists LEFT JOIN (SELECT checklist_id 
                           FROM checklist_items WHERE completed = 'f' 
                         UNION DISTINCT 
                           SELECT checklist_id 
                           FROM checklist_items 
                           GROUP BY checklist_id 
                           HAVING count(*) = 0) partial_checklists 
                  ON checklists.id = partial_checklists.checklist_id 
WHERE partial_checklists.checklist_id = NULL
于 2013-04-26T17:47:57.517 に答える
0
select count(*) completed_items
from (
    select
        c.id, c.name, count(*) total_items
    from
        checklists c
        inner join
        checklist_items ci on c.id = ci.checklist_id
    group by c.id, c.name
    having count(!completed or null) = 0
) s
于 2013-04-26T17:48:42.767 に答える