SQL - 选择具有默认值

时间:2016-02-13 18:02:57

标签: javascript mysql sql date select

我想从表中选择数据,在JavaScript中获取结果并将其打印在图表中(x =日期,y =数字)

我有以下DATA表(注意:我试图将它放在markdown中,因此它显示为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每月一行。例如,March没有记录在数据库中,所以我想要的结果是:

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

该表格将于5月份发布,因为在SELECT中我希望每月在1月到5月之间。

问题是:有没有办法在SQL中执行此操作,或者我是否必须使用JavaScript对结果进行后处理以在最终表中添加空白月份?

感谢您的帮助

编辑:开始日期和结束日期是可变的,可以涵盖几年。所以,我想有可能用一个包含月份的特殊表做一些事情,但我不知道如何...... 如果答案是后期处理,那就没关系(令人失望,但确定^^)

edit2 :问题是“填补空白”,如@mauro所述。它在MySQL中看起来相当复杂,所以我将对我的请求进行后期处理。

请参阅How to fill date gaps in MySQL?

2 个答案:

答案 0 :(得分:0)

我会创建第二个表int decimalVal = Integer.parseInt("0010101010",2); ,其中每月一行,数字= 0。然后,而不是选择:

DATA2

我会选择:

FROM DATA

这样......如果DATA包含给定月份的值,您将从DATA获得总数,如果不是......您将从DATA2获得零

答案 1 :(得分: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 >