我想从表中选择数据,在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中看起来相当复杂,所以我将对我的请求进行后期处理。
答案 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 >