我有两个桌子
表_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
答案 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。