我怎样才能让我的 SQL 计数函数变为 return 0?

How can i get a my SQL count function to return 0?

我对 SQL 还很陌生,所以请原谅我的无知,或者如果我在这里问一个基本问题。如果出口在最后一天没有创建分配,我想要做的是让我的 table 到 return 0 值。我使用的代码是这样的:

    SELECT public.outlets.title AS "Outlet",
           COUNT(public.outlets.id) AS "Assignment Count"
    FROM public.assignments 
    JOIN public.users
      ON public.users.id=public.assignments.creator_id
    LEFT JOIN public.outlets
      ON public.outlets.id = public.users.outlet_id
    WHERE public.outlets.dispatch_enabled = 'True' 
      AND DATE(public.assignments.created_at) = DATE(CURRENT_TIMESTAMP- interval '1 day') 
    GROUP BY public.outlets.title
    HAVING count(public.outlets.id) = 0
    ORDER BY public.outlets.title ASC

我已经尝试过 COALESCE,但老实说,我对它的理解还不够深入,不知道我是否正确地实施了它。就目前而言,我正在使用的当前代码给了我 "NO ROWS RETURNED"。我已经尝试取出我的 where 子句的各个部分,看看是否有帮助,但无济于事。任何帮助将不胜感激!!

您需要从 table 开始 left join,您希望保留所有行。

SELECT o.title AS "Outlet", COUNT(*) AS "Assignment Count"
FROM public.outlets o LEFT JOIN
     public.users u
     ON o.id = u.outlet_id LEFT JOIN
     public.assignments a
     ON u.id = a.creator_id AND
        DATE(a.created_at) = DATE(CURRENT_TIMESTAMP- interval '1 day') 
WHERE o.dispatch_enabled = 'True' 
GROUP BY o.title
HAVING count(*) = 0
ORDER BY o.title ASC;

注:

  • Table 别名使查询更易于编写和阅读。
  • 您需要从 public.outlets 开始,因为它定义了您要保留的行 (SELECT o.title)。
  • 其他table使用LEFT JOIN引入。
  • assignments 的条件需要在 ON 子句中而不是 WHERE 子句中。
  • id可以算,但是COUNT(*)打字比较简单

您是否正在寻找有 Assignments 数量的奥特莱斯?因为那时我认为你希望 outlets 成为 "FROM" 并且左连接分配而不是相反。

   SELECT public.outlets.title AS "Outlet",
       COUNT(public.assignments.id) AS "Assignment Count"
FROM public.outlets
JOIN public.users
  ON public.outlets.id = public.users.outlet_id   
LEFT JOIN public.assignments
  ON public.users.id=public.assignments.creator_id
  AND DATE(public.assignments.created_at) = DATE(CURRENT_TIMESTAMP-interval '1 day') 
WHERE public.outlets.dispatch_enabled = 'True' 
GROUP BY public.outlets.title
HAVING count(public.assignments.id) = 0
ORDER BY public.outlets.title ASC

你可以把WHERE条件的一部分移到LEFT JOIN,我也觉得你得调换table的顺序。最后,您必须计算连接左侧的 table 上的字段,可能使用 distinct:

select
  public.outlets.title AS "Outlet",
  COUNT(DISTINCT public.assignments.id) AS "Assignment Count"
from
  public.outlets left join public.users
  ON public.outlets.id = public.users.outlet_id

  left join public.assignments
  ON (
    public.users.id=public.assignments.creator_id
    AND DATE(public.assignments.created_at) = DATE(CURRENT_TIMESTAMP- interval '1 day')
  )
where
  public.outlets.dispatch_enabled = 'True' 
group by
  public.outlets.title
having
  count(public.outlets.id) = 0
order by
  public.outlets.title ASC

很可能问题出在那些行

LEFT JOIN public.outlets
  ON public.outlets.id = public.users.outlet_id
WHERE public.outlets.dispatch_enabled = 'True'

它要求 public.outlets.dispatch_enabled 不为 null 以便有效地将 LEFT JOIN public.outlets 转换为 INNER。因此不存在 count(public.outlets.id) = 0 的行。将其重构为

LEFT JOIN public.outlets
  ON public.outlets.id = public.users.outlet_id
     AND public.outlets.dispatch_enabled = 'True'