查找用户未创建任何条目的日子

时间:2019-12-01 17:51:01

标签: sql

我有2个表:users和time_entries,时间条目具有users表的外键。用户可以创建带有一些时间量的时间条目。我想编写一个查询,该查询可以返回按用户和日期分组的任意日期范围内的汇总时间量-很简单,但我还需要包括没有人输入任何time_entry的日期。我试图创建一个带有日历的附加表,该表带有日期并保留了加入time_entries的权限,但是我无法检索未输入任何time_entry的用户列表。这是我的查询:

SELECT te.date, SUM(te.amount), user_name
FROM calendar c
         LEFT JOIN time_entries te on c.date = te.date
         RIGHT JOIN asp_net_users anu on te.user_id = anu.id
GROUP BY user_name, te.date

2 个答案:

答案 0 :(得分:1)

如果您只希望日子,没有用户输入任何内容。您可以使用NOT EXISTS和相关的子查询。

SELECT c.date
       FROM calendar c
       WHERE NOT EXISTS (SELECT *
                                FROM time_entries te
                                WHERE te.date = c.date);

如果您希望所有用户以及尚未进行任何输入的日期与用户和日期交叉加入,然后也使用NOT EXISTS

SELECT anu.user_name,
       c.date
       FROM asp_net_users anu
            CROSS JOIN calendar c
       WHERE NOT EXISTS (SELECT *
                                FROM time_entries te
                                WHERE te.user_id = anu.id
                                      AND te.date = c.date);

答案 1 :(得分:0)

由于sticky bit的示例,我能够编写以下查询来解决我的问题:

SELECT c.date, a.id, COALESCE(sum(te.amount), 0)
FROM asp_net_users a
         CROSS JOIN (SELECT *
                     FROM calendar
                     WHERE date BETWEEN '2019-10-01 00:00:00'::timestamp AND '2019-10-31 00:00:00'::timestamp) c
         LEFT JOIN time_entries te on a.id = te.user_id AND c.date = te.date
WHERE a.department_guid = '95b7538d-3830-48d7-ba06-ad7c51a57191'
GROUP BY c.date, a.id
ORDER BY c.date