2016-02-13 79 views
1

我想从表中选择数据,得到的结果在JavaScript和图形打印选择数据(X =日期,Y =数字)SQL - 与默认值的周期

我有以下DATA表(注意:我试图把它的降价使其显示为一个HTML表格,但它似乎并不工作):

| date | number | 
|---------|--------| 
| 2015-01 | 12  | 
| 2015-02 | 7  | 
| 2015-04 | 4  | 

和下面的SQL选择:

SELECT date_format(date, '%Y-%m') AS date, number 
FROM DATA 
WHERE date >= '2015-01' AND date <= '2015-05' 
GROUP BY date 
ORDER BY date; 

哪给我和输出完全一样。但是,如果月份没有记录,我想要的是每个月的行数为0。举例来说,三月不被记录在数据库中,所以我想要的结果:

| date | number | 
|---------|--------| 
| 2015-01 | 12  | 
| 2015-02 | 7  | 
| 2015-03 | 0  | 
| 2015-04 | 4  | 
| 2015-05 | 0  | 

表进入五月,因为在选择我要1至5月每月。

问题是:有没有办法在SQL中完成它,还是必须在JavaScript中后处理结果以在我的最终表中添加空的月份?

感谢您的帮助


编辑:在开始和结束日期是可变的,可以覆盖数年。所以,我想这是可以做到的东西与包含月份一个特殊的表,但我不知道如何... 如果答案是进行后处理,这是确定(令人失望,但OK ^^)


edit2:问题是“缺口填充”所述@mauro。它在MySQL中看起来相当复杂,所以我要后处理我的请求。

看到How to fill date gaps in MySQL?

回答

0

我会创建第二个表DATA2每月和数量=零一行。然后,而不是选择:

FROM DATA 

我会选择:

FROM (SELECT * FROM DATA UNION ALL SELECT * FROM DATA2) D 

这样......如果数据包含给定月份的值,你会得到从总体数据,如果不.. 。你将从DATA2中得到零点

+0

这是一个想法。问题是,开始日期和结束日期是可变的,可以覆盖几年:/我正在编辑我的问题 我希望SQL有一种可以实现我的愿望的日期计算器... –

+0

@Rémi与其他数据库 - 具有“缺口填充”能力 - 它会容易得多,而不是“粗鲁”:-) – mauro

+0

“缺口填充”!与正确的关键字,我得到更好的搜索结果:) https://stackoverflow.com/questions/1877874/how-to-fill-date-gaps-in-mysql 看来,在MySQL中它是复杂的,所以我想我会后处理,因为它看起来非常难看,为此创建临时表...但我不知道什么是最好的表现。 谢谢! –

0

这是一个没有临时表的例子。它使用序列ENGINE。唯一的区别是您必须填写开始日期和月份数(seq_0_to_4)。

SELECT `DATE`, SUM(number) as number 
FROM (
    SELECT 
    date_format(IF(d.`DATE` IS NULL, init.`DATE`, d.`DATE`) ,'%Y-%m') AS `DATE` 
    , IF(d.number IS NULL,0,d.number) as number 
    FROM (
    SELECT '2015-01-01' + INTERVAL seq MONTH AS `DATE`, 0 AS number 
    FROM seq_0_to_4 
    ) AS INIT 
    LEFT JOIN DATA d ON date_format(d.`DATE`,'%Y-%m') = date_format(init.`DATE` ,'%Y-%m') 
) AS result 
GROUP BY `DATE` 
ORDER BY `DATE`; 

结果

+---------+--------+ 
| DATE | number | 
+---------+--------+ 
| 2015-01 |  7 | 
| 2015-02 |  0 | 
| 2015-03 |  7 | 
| 2015-04 |  0 | 
| 2015-05 |  0 | 
+---------+--------+ 
5 rows in set (0.00 sec) 

MariaDB > select * from data; 
+------------+--------+ 
| date  | number | 
+------------+--------+ 
| 2015-01-01 |  4 | 
| 2015-01-02 |  3 | 
| 2015-03-05 |  7 | 
+------------+--------+ 
3 rows in set (0.00 sec) 

MariaDB > 
+0

这可能有用,但不幸的是,MariaDB特定于此。序列引擎在MySQL中不存在,只存在于MariaDB 10 +中......所以,我会原样发表原文(* edit2 *解释了缺少MySQL功能的问题)。 我会安装MariaDB,如果可以的话,但它是一个现有的解决方案... 我只是有一个问题在你的请求:你有'IF(d.number IS NULL,0,d.number)'' ,然后在'INIT'中选择'0 AS号码'。我想这不是必需的,因为你之前直接在'IF'中使用'0',对吧? –

+0

是的,对不起。您可以删除0作为数字。我的错误 –