0

我正在处理我正在搜索订单号的查询。我需要过滤当天唯一的订单号。为此,我在主查询中使用了 count(distinct order_number)。此查询从前端获取开始和结束日期并使用它们。但是我有一个问题,如果在该范围内 2 天内有相同的 order_number,则这两天都会计算在内。即计算一天的唯一订单数。最初我想在日期上使用一些循环并对结果求和,但这对我来说并不合适。我会更感兴趣使用相同的查询并根据日期为不同的订单修改它。这是我的查询:

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS DATE,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY DATE

例子

假设日期为 8 月 29 日,我有订单 o1、o2、o1、o3、o2 我将它们计为 3 个不同的订单,即 8 月 30 日的 o1、o2、03,我有订单 o1、o4、o4、o1 我将它们计为2个不同的订单,即o1,o4

但是当我查询 8 月 29 日至 30 日时,我必须得到 3+2 = 5 的计数,即 o1 在 sicne 范围内被计数两次,它属于两个不同的日期。

4

1 回答 1

2

我认为在这种情况下,WITH ROLLUP修饰符可能会达到您的目的

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS `DATE`,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY `DATE` WITH ROLLUP

这将在数​​据的末尾添加一个额外的行,对数据求和total_orders(对于 NULL 值DATE

这是有关此修饰符的文档:http: //dev.mysql.com/doc/refman/5.5/en/group-by-modifiers.html

于 2013-10-04T22:03:29.883 回答