T-SQL在给定日期范围内的同一天查找来自同一客户的多个订单

时间:2014-06-12 14:49:03

标签: sql sql-server tsql

我正在尝试准备工作报告,我需要查看客户是否已取消并重新提交订单。没有任何方法可以链接两个订单,我必须继续的是customer_id,order_date和状态。我需要找到特定日期范围内的所有客户,这些客户在同一天放置了多个订单记录,返回customer_id就够了

order_id    customer_id         order_date              status
1           1234                30/12/2013 09:10:55     CANCELLED
2           2222                30/12/2013 09:17:12     APPROVED
3           4321                30/12/2013 10:04:10     APPROVED
4           1234                30/12/2013 10:22:01     APPROVED

在上面的示例数据中,它会找到订单1和4并返回customer_id 1234.状态是什么并不重要,因为我可以从报告中选择那些。

我已经做了一些挖掘并想出了类似的东西:

SELECT customer_id,
    (SELECT COUNT(*) AS count
    FROM orders AS o2
    WHERE (order_date = o1.order_date)) AS counter
FROM            orders AS o1
WHERE        (order_date BETWEEN '2013-12-01' AND '2014-01-01')
GROUP BY customer_id, order_date
HAVING        (counter >= 2)

但是在尝试运行时遇到错误,所以我显然在某处出现了一些错误。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:5)

子查询有点偏,但您可以完全跳过子查询,只需按customer_id分组,order_date的日期部分并计算每天的结果;

SELECT DISTINCT customer_id
FROM orders
WHERE order_date >= '2013-12-01' AND order_date < '2014-01-02'
GROUP BY customer_id, CAST(order_date AS DATE)
HAVING COUNT(*) >= 2

An SQLfiddle to test with

请注意,由于您的日期附加了任意时间,因此如果不在where子句中转换为BETWEEN,则无法轻松使用DATE。直接比较日期更容易(上限小于覆盖前一天的所有时间)