我尝试在我的应用中实现一些统计信息。
实际上,我要显示两个日期范围内的所有“销售额”(订单数量和总金额)。
我使用以下查询:
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"
适用于该系列。现在我想像我想要的那样放大“范围的所有日子”,“范围的所有日子”
例如,该范围的所有日子:
例如,对于该范围的所有月份:
是否可以使用相同的查询执行该操作,只需添加类似“GROUP BY”的内容?
我知道有很多不同的方法可以达到我想要的结果......但有一次,我想用MySQL做一件干净的事情,有点“专业”。
美好的一天
答案 0 :(得分:1)
您可以使用UNION ALL
做一些时髦的事情,但我可能会将这三个查询分开。
您可能想要一些应用程序代码将结果呈现为某种类型的表格或图表,并且我会花费三次调用的开销。
我按如下方式运行查询:
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。
另一种选择是仅运行第二个查询(按日期分组)并汇总应用程序代码中的月份和范围总计。