日期期间的汇总

时间:2014-08-01 15:02:00

标签: sql oracle11g

我有一个类别列表和另一个条目表,它与它所属的类别有关。我试图聚合这些工作正常,但是当我添加一个日期参数时,任何在该时间段内没有条目的类别都不会显示,我希望它显示为0

SELECT DISTINCT c.label, COUNT(e.user_id) AS TOTAL
FROM category c, entry e
WHERE c.id NOT IN (19,20)
WHERE e.category_id(+) = c.id
AND e.date_added > (SYSDATE - 14) -- Problem
GROUP BY(c.label)

我理解为什么它没有出现,只是不确定它的方式?

更新

分类表 - ID - 标签 ...

条目表 - ID - category_id - e.user_id ...

它在给定时间段组中的所有条目属于它们属于哪个类别。我想显示我的所有类别,即使在这段时间内没有条目。我认为外部联接会解决这个问题。

1 个答案:

答案 0 :(得分:1)

首先,学习正确的join语法。并且,当您使用select distinct时,您不需要group by。您的查询将如下所示:

SELECT c.label, COUNT(e.id) AS TOTAL
FROM category c LEFT JOIN
     entry e
     ON e.category_id = c.id
WHERE c.id NOT IN (19, 20) AND e.date_added > (SYSDATE - 14)
GROUP BY c.label;

然后,如果要保留所有类别,请将第二个表(e)上的条件移动到on子句中:

SELECT c.label, COUNT(e.id) AS TOTAL
FROM category c LEFT JOIN
     entry e
     ON e.category_id = c.id AND
        e.date_added > (SYSDATE - 14)
WHERE c.id NOT IN (19, 20)
GROUP BY c.label;

这是显式join语法更好的原因之一。