2014-09-04 58 views
0

我想弄清楚如何在不存在关联示例的情况下在不同日期记录计数。SQL:获取计数返回0,同时在一个表中使用组

我的示例表包含以下几列: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的初学者,我对理解逻辑确实有些困难。

+0

为什么要投射'created_date'?如果它的日期时间或日期数据类型不需要这样做。如果它的varchar那么你可能需要使用'str_to_date()'。尝试在sqlfiddle.com上添加一些示例数据来调试问题。 – 2014-09-04 07:41:34

+0

嗨,阿比克,我推出它,因为它包含一个时间戳,但我不需要这些信息。我基本上每天都想知道记录的数量,所以我将日期时间转换为一个简单的日期,以便基本上切断时间戳。 – user2662437 2014-09-04 07:44:02

+0

日期'2014-01-26'没有记录... – zhongxiao37 2014-09-04 07:55:56

回答

0

标记为回答,我会重新发布我的评论这个问题:

你应该有calendar表为工作,因为没有其他的方式来填补日期空白。 This可能会帮助你。

顺便说一句,您可能想使用DATE()而不是CAST(),因为它更容易理解。

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; 

这可能是我应该提到这只是一个例子,你需要确定打造性能查询的正确方法基础上有多少数据是你的表/索引等