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