sql语句group by日期时对于无数据的记录(原本查不到)补足

sql语句group by日期时,对于无数据的记录进行补足

问题描述: 查询数据库时,先根据数据记录的日期分组,再根据另一字段,如:例子中使用"项目名称"这一字段再分组,我们要获得的数据按日期、项目名称分组后的所有数据。显然,对于有些记录,其在某个日期下有数据,那么分组后必然查得到;对于某些记录,在该日期下可能没有数据,那么正常来说查不到该记录,即出现如图情况:
sql语句group by日期时对于无数据的记录(原本查不到)补足
项目名称为“Honda二期”的在“2019-02-18”、“2019-02-25”、“2019-03-04”、“2019-03-11”和“2019-03-18”下都有记录,但是项目名称为“IPC三期”的只有“2019-02-18”这条记录,但是我们想要的却是这种效果:
sql语句group by日期时对于无数据的记录(原本查不到)补足
即要将未查询对应日期有数据的记录也显示出来,并将“记录数量”置0

思考与解决: 能否直接利用表的关联查询直接实现?答案是可以。试想一下,要补齐所有无数据的以日期、项目名称分组的记录,是不是应该先拿到所有以日期、项目名称分组的一张表(我们称为date_project_table)?

那么如何拿到包含所有日期和所有项目名称的这张表date_project_table?
答:使用笛卡儿积关联两所有项目名称的表project_table和所有日期的表date_table即可。

那么问题就很简单了,利用数据库表的left join关联查询,左边主表就是date_project_table(因为left join时主表的数据全部显示),右边副表就是我们之前查询到的未查全的表,我们称为date_project_unperfect_table,关联字段就是”项目名称“和“起始日期”两个字段。

SQL伪代码:

SELECT 项目名称, 起始日期, 记录数量
FROM (
	SELECT 项目名称, 起始日期
	FROM project_table, date_table
	WHERE project_table.项目名称 = date_table.起始日期
) date_project_table
	LEFT JOIN date_project_unperfect_table
	ON date_project_table.项目名称 = date_project_table.项目名称
		AND date_project_table.起始日期 = date_project_table.起始日期
GROUP BY 项目名称

总结: 对于想要查询到的数据,要先构思其包含的数据有哪些字段、成功查询到的数据表是什么样的,然后逐个筛选能使用到的工具,如:表的各种关联(笛卡儿积、左外关联、内联等),最后sql尝试,一气呵成最好!