MYSQL 按两个日期范围对统计信息进行分组以进行统计
MYSQL group stats by range of two dates for statistics
我尝试在我的应用程序中实现一些统计信息。
实际上我想要显示两个日期范围内的所有 "sales"(订单数量和总金额)。
我使用以下查询:
SELECT COUNT(order.id), SUM(order.total_amount) FROM `order` WHERE payed_at BETWEEN "2015-07-01 00:00:00" AND "2015-08-25 00:00:00"
它适用于范围。现在我想缩放,就像我想按 "all days of the range"、"all monthes of the range"
分组一样
例如范围内的所有天数:
- |2015-07-01 | 0 | 0 |
- |2015-07-02 | 1 | 3000 |
- ...
- |2015-08-20 | 3 | 450 |
例如范围内的所有月份:
- |2015-07-01 | 40 | 15200 |
- |2015-08-01 | 23 | 3890 |
是否可以使用相同的查询执行该操作,只需添加类似 "GROUP BY" 的内容?
我知道有很多不同的方法可以达到我想要的结果...但是有一次,我想用 MySQL 做一些干净的事情,有点 "professional".
美好的一天
您可以使用 UNION ALL
做一些时髦的事情,但我可能会将这三个查询分开。
无论如何,您可能需要一些应用程序代码将结果呈现为 table 或某种图形,我将承担三个调用的开销。
我运行查询如下:
SELECT COUNT(order.id),
SUM(order.total_amount)
FROM `order`
WHERE payed_at >= :start_date
AND payed_at < :end_date + INTERVAL 1 DAY
SELECT DATE(payed_at) payed_date
COUNT(order.id),
SUM(order.total_amount)
FROM `order`
WHERE payed_at >= :start_date
AND payed_at < :end_date + INTERVAL 1 DAY
GROUP BY payed_date
SELECT EXTRACT(YEAR_MONTH FROM payed_at) payed_year_month
COUNT(order.id),
SUM(order.total_amount)
FROM `order`
WHERE payed_at >= :start_date
AND payed_at < :end_date + INTERVAL 1 DAY
GROUP BY payed_year_month
在查询包含 BETWEEN
的日期范围时,我更喜欢 >=
/<
的确切逻辑。
按月分组时,如果范围可以跨越一年,请务必记住也包括年份。 EXTRACT
的替代方法包括 LAST_DAY
和 DATE_FORMAT
.. 请参阅 MySQL Date and Time Functions.
另一种选择是仅 运行 第二个查询(按日期分组)并在应用程序代码中汇总月份和范围总计。
我尝试在我的应用程序中实现一些统计信息。
实际上我想要显示两个日期范围内的所有 "sales"(订单数量和总金额)。
我使用以下查询:
SELECT COUNT(order.id), SUM(order.total_amount) FROM `order` WHERE payed_at BETWEEN "2015-07-01 00:00:00" AND "2015-08-25 00:00:00"
它适用于范围。现在我想缩放,就像我想按 "all days of the range"、"all monthes of the range"
分组一样例如范围内的所有天数:
- |2015-07-01 | 0 | 0 |
- |2015-07-02 | 1 | 3000 |
- ...
- |2015-08-20 | 3 | 450 |
例如范围内的所有月份:
- |2015-07-01 | 40 | 15200 |
- |2015-08-01 | 23 | 3890 |
是否可以使用相同的查询执行该操作,只需添加类似 "GROUP BY" 的内容?
我知道有很多不同的方法可以达到我想要的结果...但是有一次,我想用 MySQL 做一些干净的事情,有点 "professional".
美好的一天
您可以使用 UNION ALL
做一些时髦的事情,但我可能会将这三个查询分开。
无论如何,您可能需要一些应用程序代码将结果呈现为 table 或某种图形,我将承担三个调用的开销。
我运行查询如下:
SELECT COUNT(order.id),
SUM(order.total_amount)
FROM `order`
WHERE payed_at >= :start_date
AND payed_at < :end_date + INTERVAL 1 DAY
SELECT DATE(payed_at) payed_date
COUNT(order.id),
SUM(order.total_amount)
FROM `order`
WHERE payed_at >= :start_date
AND payed_at < :end_date + INTERVAL 1 DAY
GROUP BY payed_date
SELECT EXTRACT(YEAR_MONTH FROM payed_at) payed_year_month
COUNT(order.id),
SUM(order.total_amount)
FROM `order`
WHERE payed_at >= :start_date
AND payed_at < :end_date + INTERVAL 1 DAY
GROUP BY payed_year_month
在查询包含 BETWEEN
的日期范围时,我更喜欢 >=
/<
的确切逻辑。
按月分组时,如果范围可以跨越一年,请务必记住也包括年份。 EXTRACT
的替代方法包括 LAST_DAY
和 DATE_FORMAT
.. 请参阅 MySQL Date and Time Functions.
另一种选择是仅 运行 第二个查询(按日期分组)并在应用程序代码中汇总月份和范围总计。