MySQL COUNT - 返回零结果,而不是NULL
我试图从MySql返回一个结果集,该结果集按年和月分组,并且每个YEAR / MONTH返回一个计数。
这是我开始的地方:
SELECT YEAR(p.pEndDate) AS pYear, MONTHNAME(p.pEndDate) AS pMonth, count(*) AS pNum
FROM projects p
WHERE p.status=3
GROUP BY YEAR(p.pEndDate), MONTH(p.pEndDate)
这个SQL基本上完成了我需要的90%,除非有一个月的计数为零。例如,2009年7月零项目的状态为3,所以我得到:
2008 November 1
2009 January 2
2009 February 2
2009 March 2
2009 April 1
2009 May 2
2009 June 3
2009 August 2
2009 September 1
2009 October 1
2009 November 2
2009 December 1
2010 January 4
2010 February 1
2010 March 1
2010 April 3
2010 May 3
2010 June 3
2010 July 3
2010 August 3
2010 September 3
2010 October 2
2010 November 2
2010 December 3
2011 January 2
2011 February 1
注意七月是不是在那里。
所以我开始做一些研究,使用另一个表来强制结果集包括7月。所以我创建了一个新表'monthTable'并添加了两列monthID int Primary Key,monthName VARCHAR(3)。
我已经尝试了很多不同的方法来使用这个表,从右边的JOIN开始等等。没有一个已经产生了成功的结果,事实上我几乎所做的一切都产生了与上面相同的结果集。
任何帮助将不胜感激!
没有找到相关结果
已邀请:
3 个回复
诫商
我的猜测是你正在尝试这样的事情
问题是WHERE子句将过滤掉任何没有任何p.status值(null)的记录。您需要将此类过滤器移动到JOIN子句,如下所示
好奇,但是表格如何就足够了,尤其是monthName只是varchar(3)?
尝试像这样创建它(一次性)
然后使用此查询(1-pass对数据进行分组,然后左连接以生成0)
捅瓶啡
的辅助表,其整数从0到9,你可以生成任何类型的完整序列。您的问题不是日期值的计数为空,而是日期值根本不存在。所以说你想要在2004年1月到2006年3月之间的月度计数,你可以使用
表创建一个临时日期列表,如下所示:
然后如其他地方所述,您将实际数据加入日期列表ON(年份=年份和月份=月份)。 这是在我自己的表(msds)上完成的类似查询,用于说明:
吠强祷豪硅
这将是一次性插入,表格将保持静态,直到您需要更多月或数年为止。有了它,我们现在将您的Projects表左连接到Numbers表:
加成 根据评论,我们没有被告知基础数据的性质。但是,如果有问题的值是日期而不是日期和时间,那么更快的方法是Calendar表而不是Numbers表。与Numbers表一样,这将是一个包含Projects表中日期时间段的连续日期的静态表。