从 MySQL 单表检索全面数据:覆盖空行和最近的事务
在本次讨论中,我们旨在解决一个共同的挑战查询数据库时面临的问题是:如何将最近的交易和空天数合并到结果中。具体来说,我们将重点检索过去 7 天的销售交易,同时包括没有任何活动的日子的空行。
首先,我们将利用 COALESCE() 函数的功能,该函数使我们能够替换如果表达式的计算结果为 NULL,则为默认值。在本例中,我们将使用 0 作为空行的默认值。
然后我们将创建一个子查询来生成过去 7 天的完整日期列表。这将作为完整结果集的基础,确保包含空行。
最后,我们将在生成的日期列表和交易表之间执行 LEFT JOIN 操作,根据 PURCHASE_DATE 匹配记录柱子。这会将交易与空日期记录合并,使我们能够计算每天的总销售额并显示最近的交易和空行。
生成的查询将有效地提供过去七次的全面概述销售交易天数,占没有记录活动的天数。
以下是完整的查询供参考:
SELECT t1.purchase_date, COALESCE(SUM(t1.amount + t2.amount), 0) AS amount FROM ( SELECT DATE_FORMAT(a.Date,'%Y-%m-%d') AS purchase_date, '0' AS amount FROM ( SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c ) a WHERE a.Date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() ) t1 LEFT JOIN ( SELECT DATE_FORMAT(purchase_date, '%Y-%m-%d') AS purchase_date, COALESCE(SUM(amount), 0) AS amount FROM transactions WHERE purchase_date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() GROUP BY purchase_date ) t2 ON t2.purchase_date = t1.purchase_date GROUP BY t1.purchase_date ORDER BY t1.purchase_date DESC;
以上是如何从 MySQL 表中检索过去 7 天的完整销售数据,包括没有交易的天数?的详细内容。更多信息请关注PHP中文网其他相关文章!