MYSQL,明智地计算周数,并显示空日期的总和

时间:2019-06-18 07:55:07

标签: mysql node.js

我有两个桌子

表_1:Routes_Day_plan

Date        Status_Id
------------------------
2019-06-09  1
2019-06-10  2
2019-06-09  2
2019-06-11  3
2019-06-14  4
2019-06-14  6
2019-06-15  8

表_2:代码

id code
-------
1  Leave
2  Half_leave
3  Holiday
4  Work
5  Full_Hours

现在我的任务是从表1开始按周计算,其中代码(从第二个表开始)= Leave,Half_leave,work并且比还显示sum,而未找到日期则显示0,我将此查询写为返回数据,但是非空日期有人可以帮助

我的查询

select COUNT(*) as available, DATE(date) 
from Table_1 
where status_id in (
   select id from codes 
   where code in ('Leave','Half_leave','work')) 
AND DATE(date) >= DATE('2019-06-09') AND DATE(date) <= DATE('2019-06-16') 
group by date 

UNION ALL 

SELECT COUNT(date), 'SUM' date 
FROM Table_1 
where status_id in (
   select id from codes 
   where code in ('Leave','Half_leave','work')) 
AND DATE(date) >= DATE('2019-06-09') AND DATE(date) <= DATE('2019-06-16')

结果类似

available   Dates
------------------------
5      2019-06-09
2      2019-06-10
3      2019-06-11
3      2019-06-12
2      2019-06-14
2      2019-06-15
17     SUM

我想要这样

available  Dates
------------------------
5      2019-06-09
2      2019-06-10
3      2019-06-11
3      2019-06-12
0      2019-06-13
2      2019-06-14
2      2019-06-15
17     SUM

2 个答案:

答案 0 :(得分:0)

您最好的选择是拥有一个“日期维度/查询”表,其中包含全年的预填充日期。通过将记录表加入此查找,您实际上可以将数据分配到实际存在的每个日期(例如2019-06-13),如果在查找中未找到数据,则在该字段中将找到null。 / p>

Count函数会将空值计数为0。只需确保将查找表中的日期字段分组,而不是记录表中的日期字段分组。

答案 1 :(得分:0)

从开始到结束,创建一个表,一个包含所有日期值的日期维。像这样:

Set EndDate = '2099-01-01'; 
Set RunDate = '1900-01-01';
WHILE RunDate <= EndDate DO
insert into dim_date
(`DATE`)
select
RunDate as DATE
;



Set RunDate = ADDDATE(RunDate,1);

END WHILE;

创建一个临时表,其中dim_date左连接Routes_Day_plan,并将Status设置为0,也许用于不匹配的记录。然后使用此临时表代替查询中的Routes_Day_plan。