Mysql 创建带有日期间隔的报告
我需要在一定的日期范围内做一份销售报告。 我的问题是,该报告还应包括当天没有进行任何销售的卖家 供应商表Mysql 创建带有日期间隔的报告,mysql,sql,Mysql,Sql,我需要在一定的日期范围内做一份销售报告。 我的问题是,该报告还应包括当天没有进行任何销售的卖家 供应商表 id | name ---------- 1 | John 2 | Tom 销售表 id | vendor_id | date | status | price ------------------------------------------------ 1 | 1 | 2019-01-01 | 0 | 100 2 |
id | name
----------
1 | John
2 | Tom
销售表
id | vendor_id | date | status | price
------------------------------------------------
1 | 1 | 2019-01-01 | 0 | 100
2 | 1 | 2019-01-01 | 0 | 100
3 | 2 | 2019-01-01 | 0 | 100
4 | 2 | 2019-01-02 | 0 | 100
所需报告:2019-01-01和2019-01-04之间的总销售额
要生成日期序列,我正在使用日期生成器
当我左交叉连接销售生成的日期时,我得到以下结果:
SELECT date_generator.daily_date, vendors.name, sales.price
FROM (
SELECT DATE_ADD(@startDate, INTERVAL (@i:=@i + 1) - 1 DAY) AS daily_date
FROM information_schema.columns, (SELECT @i:=0) gen_sub
WHERE DATE_ADD(@startDate, INTERVAL @i DAY) BETWEEN @startDate AND @endDate
) date_generator
LEFT JOIN sales ON DATE(sales.date) = DATE(date_generator.daily_date)
LEFT JOIN vendors ON vendors.id = sales.vendor_id
ORDER BY date_generator.daily_date
date |vendor| price
--------------------------
2019-01-01 | John | 100
2019-01-01 | John | 100
2019-01-01 | Tom | 100
2019-01-02 | Tom | 100
2019-01-03 | null | null
2019-01-04 | null | null
你能给我一些技巧来获得供应商和日期的分组吗?由于有些日子没有销售,你将有一个空的sales.vendor.id值,因此没有任何东西可以加入供应商。为了确保在所有日期获得所有供应商,您需要从date_generator到供应商进行交叉联接,然后将联接留给sales。然后,您需要按日期和供应商获取sales.price和GROUP的总和,以获得所需的输出:
SELECT date_generator.daily_date, vendors.name, SUM(sales.price)
FROM (
SELECT DATE_ADD(@startDate, INTERVAL (@i:=@i + 1) - 1 DAY) AS daily_date
FROM information_schema.columns, (SELECT @i:=0) gen_sub
WHERE DATE_ADD(@startDate, INTERVAL @i DAY) BETWEEN @startDate AND @endDate
) date_generator
CROSS JOIN vendors
LEFT JOIN sales ON DATE(sales.date) = DATE(date_generator.daily_date) AND vendors.id = sales.vendor_id
GROUP BY date_generator.daily_date, vendors.name
你的方法似乎是错误的。首先,你从不累计和求和,那么你怎么期望“200”?第二,虽然带有子查询的日期生成器很智能,但它不能满足您的需要,因为您每天只能获得与该日期有销售额的供应商数量相同的行数,并且使用左联接,您将在没有供应商有销售额的日期获得空值。我建议你除了添加分组和聚合之类的东西之外,还可以简化查询,并将日期间隔逻辑传输到应用层。回答得很好,我吓坏了。谢谢你,尼克@米格尔:不用担心。很高兴我能帮忙。
SELECT date_generator.daily_date, vendors.name, SUM(sales.price)
FROM (
SELECT DATE_ADD(@startDate, INTERVAL (@i:=@i + 1) - 1 DAY) AS daily_date
FROM information_schema.columns, (SELECT @i:=0) gen_sub
WHERE DATE_ADD(@startDate, INTERVAL @i DAY) BETWEEN @startDate AND @endDate
) date_generator
CROSS JOIN vendors
LEFT JOIN sales ON DATE(sales.date) = DATE(date_generator.daily_date) AND vendors.id = sales.vendor_id
GROUP BY date_generator.daily_date, vendors.name