您正在寻找一种方法来获取列出的所有日期,甚至是那些未在您的列表中表示的日期customer
桌子。这是 SQL 中臭名昭著的难题。这是因为 SQL 的纯粹形式缺乏任何连续序列的概念……基数、天数等等。
因此,您需要引入一个包含连续基数、日期或其他内容的源的表,然后将现有数据左连接到该表。
有几种方法可以做到这一点。一是为自己创造一个calendar
表中的每一行代表当前十年或本世纪或其他时间的每一天,然后加入其中。 (与现代数据库的功能相比,该表不会很大。
假设您有该表,并且它有一个名为date
。那么你就会这样做。
SELECT calendar.date AS created,
ISNULL(a.customer_count, 0) AS customer_count
FROM calendar
LEFT JOIN (
SELECT COUNT(*) AS customer_count,
DATE(created) AS created
FROM customer
GROUP BY DATE(created)
) a ON calendar.date = a.created
WHERE calendar.date BETWEEN start AND finish
ORDER BY calendar.date
请注意几件事。首先,LEFT JOIN
从日历表到您的数据集。如果你用的是普通的JOIN
数据集中缺失的数据将抑制日历中的行。
其次,ISNULL
在顶层SELECT
将数据集中缺失的 null 值转换为零值。
现在,您会问,我在哪里可以获得该日历表?我恭敬地建议您查一下,如果您无法弄清楚,请再问一个问题。
我就此写了一篇小文章,您可以在这里找到。http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/