2017-04-04 122 views
0

我对SQL相当陌生,所以请原谅我的无知,或者我在这里提出一个基本问题。我想要做的是让我的表返回0值,如果一个插座没有在最后一天创建一个任务。我使用的代码是这样的:我怎样才能让我的SQL计数函数返回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,但说实话我不太了解它足够好,知道我是否正确实施它。就目前而言,目前我使用的代码是给我“没有返回的行”。我试过把我的where子句的各个部分拿出来看看这是否会有所帮助,但没有。任何帮助将不胜感激!!

+0

你'LEFT JOIN'到'public.outlets'被打败你的'WHERE'在'public.outlets'检查值子句。它可能是一个内部连接,这就是为什么你没有行。 –

回答

0

您是否在寻找具有分配计数的奥特莱斯?因为那时我认为你希望网点成为“发件人”,而不是相反方向的左侧加入。

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 
+0

这工作!谢谢!所以要清楚,我是否倒退了?再次,抱歉我的基本问题,但谢谢你! – Keana

+0

是的,从你知道的表开始将有一个记录,然后离开连接到可能没有记录的表,然后查找没有记录的行。不要混淆你,但你也可以用左连接为空格式来做到这一点。你可以查看它,它会工作几乎相同。 – CraigS

0

您需要开始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; 

注:

  • 表的别名使查询更容易编写和阅读。
  • 您需要以public.outlets开头,因为它定义了您想要保留的行(SELECT o.title)。
  • 其他表格使用LEFT JOIN引入。
  • assignments上的条件需要在ON子句中,而不是WHERE子句中。
  • 您可以统计id,但COUNT(*)更容易输入。
0

您可以将WHERE条件的一部分移动到LEFT JOIN,并且我也认为您必须切换表的顺序。最后,你要指望的左侧部分上表中字段的加入,可能使用不同的:

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 
0

最有可能的问题是

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

它需要public.outlets.dispatch_enabled是那些线非空,因此有效地将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' 
相关问题