我怎样才能让我的 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'
我对 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'