这个sql有点东西,记录一下

我有一个需求:在订单表里面查询指定时间的订单数据,如果要是没有订单的话,需要展示当天日期和数据,数据为0

先看一下效果:

话不多说,直接上SQL

sql 复制代码
SELECT
	date_range.date AS 日期,
	COUNT( oco.id ) AS 总订单,
	COUNT( oco.pay_price ) AS 成功订单,
	IFNULL( sum( oco.pay_price ), 0 ) AS 客户付款金额 
FROM
	(
SELECT
	DATE( '2023-11-01' ) + INTERVAL t0.num DAY AS date 
FROM
	(
SELECT
	( a.num + b.num + c.num + d.num + e.num ) num 
FROM
	(
SELECT
	0 num UNION ALL
SELECT
	1 num UNION ALL
SELECT
	2 num UNION ALL
SELECT
	3 num UNION ALL
SELECT
	4 num UNION ALL
SELECT
	5 num UNION ALL
SELECT
	6 num UNION ALL
SELECT
	7 num UNION ALL
SELECT
	8 num UNION ALL
SELECT
	9 num 
	) a,
	(
SELECT
	0 num UNION ALL
SELECT
	10 num UNION ALL
SELECT
	20 num UNION ALL
SELECT
	30 num UNION ALL
SELECT
	40 num UNION ALL
SELECT
	50 num UNION ALL
SELECT
	60 num UNION ALL
SELECT
	70 num UNION ALL
SELECT
	80 num UNION ALL
SELECT
	90 num 
	) b,
	(
SELECT
	0 num UNION ALL
SELECT
	100 num UNION ALL
SELECT
	200 num UNION ALL
SELECT
	300 num UNION ALL
SELECT
	400 num UNION ALL
SELECT
	500 num UNION ALL
SELECT
	600 num UNION ALL
SELECT
	700 num UNION ALL
SELECT
	800 num UNION ALL
SELECT
	900 num 
	) c,
	(
SELECT
	0 num UNION ALL
SELECT
	1000 num UNION ALL
SELECT
	2000 num UNION ALL
SELECT
	3000 num UNION ALL
SELECT
	4000 num UNION ALL
SELECT
	5000 num UNION ALL
SELECT
	6000 num UNION ALL
SELECT
	7000 num UNION ALL
SELECT
	8000 num UNION ALL
SELECT
	9000 num 
	) d,
	(
SELECT
	0 num UNION ALL
SELECT
	10000 num UNION ALL
SELECT
	20000 num UNION ALL
SELECT
	30000 num UNION ALL
SELECT
	40000 num UNION ALL
SELECT
	50000 num UNION ALL
SELECT
	60000 num UNION ALL
SELECT
	70000 num UNION ALL
SELECT
	80000 num UNION ALL
SELECT
	90000 num 
	) e 
	) t0 
WHERE
	DATE( '2023-11-01' ) + INTERVAL t0.num DAY <= '2023-11-31' 
	) date_range
	LEFT JOIN user_order oco ON date_range.date = DATE( oco.create_time ) 
	AND oco.company_id = 15 
GROUP BY
	date_range.date 
ORDER BY
	date_range.date ASC;

讲解一下难点:

这条SQL语句的难点主要在于日期范围的生成和连接查询。首先,它使用了一个复杂的子查询来生成从指定日期开始的一个日期范围,这里使用了多个联结查询来生成连续的数字序列,然后通过日期相加得到连续的日期序列。这种技巧对于初学者来说可能比较难的

其次,它采用了左连接(LEFT JOIN)来连接日期范围表和订单表,并进行统计。左连接会返回左表中所有的行,即使右表中没有匹配的行。对于初学者来说,理解连接查询的逻辑和结果可能需要一些时间

最后,它使用了聚合函数COUNT和SUM来对订单数据进行统计,以及使用了IFNULL函数来处理空值。这些函数的使用对于初学者来说可能需要一些熟练度

因此,这条SQL语句的难点在于对日期范围的生成、连接查询和聚合函数的理解和熟练运用

相关推荐
持敬chijing11 分钟前
Web渗透之前后端漏洞-文件下载漏洞
sql·web安全·网络安全·网络攻击模型·web
tiancaijiben12 分钟前
阿里云云备份(Cloud Backup)全量对接与使用指南
数据库·oracle
sulikey23 分钟前
数据库中等值连接与自然连接的区别。为什么不建议使用自然连接?
数据库·sql·mysql·等值连接·自然连接
IT策士34 分钟前
Redis 从入门到精通:分布式锁 —— 从 SETNX 到 Redlock
数据库·redis·分布式
云计算磊哥@36 分钟前
运维开发宝典027-MySQL03数据库的增删改查
运维·数据库·运维开发
李白的天不白38 分钟前
数据库的CEUD
数据库·sql·oracle
linux修理工1 小时前
kafka积压
数据库·分布式·kafka
i220818 Faiz Ul1 小时前
药店管理|基于springboot + vue药店管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·美食分享系统
不吃土豆的马铃薯1 小时前
C++ 正则表达式入门详解
linux·服务器·网络·数据库·c++·正则表达式
sulikey1 小时前
数据库系统概论 - 定义与查询 期末速成课笔记
数据库·笔记·期末考试·数据查询·期末速成·数据库系统概论·数据定义