SQL:在一个表中使用group by时使计数返回0

时间:2014-09-04 07:39:18

标签: mysql sql sql-server

我试图弄清楚如何在一个例子中没有关联此类记录的情况下在不同日期接收记录计数。

我的示例表包含以下列:date_createdkey

我希望看到的是:

date              count
----------        -----
2014-01-27        3
2014-01-26        0
2014-01-25        1

但我看到的是:

date              count
----------        -----
2014-01-27        3
2014-01-25        1

这是我正在运行的查询,如果存在记录,它只会给我一个计数:

SELECT CAST(created_date as date), COUNT(*)  
FROM TEST 
WHERE CAST(created_date as date) >= '2014-01-21' AND
      CAST(created_date as date) <= '2014-08-02' AND
      key = 'foobar'
GROUP BY CAST(created_date as date)

如果我做了一些不必要的事情,请道歉。根据我的研究,我已经看到了一些使用左连接的解决方案;但是,作为SQL的初学者,我真的很难理解逻辑。

2 个答案:

答案 0 :(得分:0)

为了将该问题标记为已回答,我会重新发表评论:

您应该有calendar表格,因为没有其他方法可以填补日期空白。 This可能会对您有所帮助。

顺便说一句,您可能希望使用DATE()代替CAST(),因为它更容易理解。

答案 1 :(得分:0)

您将需要使用日历表,以便获得您感兴趣的完整日期列表。例如,从此开始:

CREATE TABLE test (created_date datetime, keytext varchar(200));
CREATE TABLE CalendarDays (date datetime);

INSERT INTO test (created_date, keytext) VALUES ('2014-1-1', 'foobar'), ('2014-1-5', 'foobar');    
INSERT INTO CalendarDays values ('2014-1-1'), ('2014-1-2'), ('2014-1-3'), ('2014-1-4'), ('2014-1-5')

然后你可以使用这样的sql语句来提供你正在寻找的结果。

select d.date, count(t.keytext)
from calendarDays as d
  left join test as t on d.date = t.created_date
group by d.date;

这可能是我应该提到的,这只是一个示例,您需要根据表/索引中的数据量等确定构建性能查询的正确方法。