一、根据每日分组

先查出时间段内的每一天

SELECT
	date_add( date_sub( #{startDate}, INTERVAL 1 DAY ), INTERVAL ( cast( help_topic_id AS signed INTEGER ) + 1 ) DAY ) days 
FROM
	mysql.help_topic 
WHERE
	help_topic_id < DATEDIFF( #{endDate}, date_sub( #{startDate}, INTERVAL 1 DAY ) ) 
ORDER BY
	help_topic_id

再使用外连接查询完成自己的业务

SELECT
	days.days date,
	IFNULL( SUM( b.total_price ), 0 ) num 
FROM
	(
SELECT
	date_add( date_sub( #{startDate}, INTERVAL 1 DAY ), INTERVAL ( cast( help_topic_id AS signed INTEGER ) + 1 ) DAY ) days 
FROM
	mysql.help_topic 
WHERE
	help_topic_id < DATEDIFF( #{endDate}, date_sub( #{startDate}, INTERVAL 1 DAY ) ) 
ORDER BY
	help_topic_id 
	) days
	LEFT JOIN ds_order b ON TO_DAYS( b.create_time) = TO_DAYS( days.days ) 
GROUP BY
	days.days

注意:
如果查询SQL时提示“1142 - SELECT command denied to user ‘asd’@‘ip地址’ for table ‘help_topic’”,表明没有权限访问help_topic表。可以创建一个help_topic表,只需要有help_topic_id列自增,并且填充一些数据:1,2,3,4,5,6,7…,将查询SQL语句中的mysql.去除,即可满足该功能。

二、根据月份分组

获取所传时间段内每个月份

SELECT
	DATE_FORMAT( m1, '%Y-%m' ) m1 
FROM
	(
SELECT
	( '2023-11-01' - INTERVAL DAYOFMONTH( '2023-11-01' ) - 1 DAY ) + INTERVAL m MONTH AS m1 
FROM
	(
SELECT
	@rownum := @rownum + 1 AS m 
FROM
	( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) t1,
	( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) t2,
	( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) t3,
	( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) t4,
	( SELECT @rownum :=- 1 ) t0 
	) d1 
	) d2 
WHERE
	m1 <= '2024-01-01' 
ORDER BY
	m1

再使用外连接查询完成自己的业务

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐