2

我有由 customer_id 相关的 CUSTOMERS 和 ORDERS 表。我只想获取每个客户已下订单的数量。我成功使用了这个示例sqlfiddle

但是,记录集很大,我只想将每个客户的记录总数限制为最近更改了该数字的记录。一种可能的解决方案是列出过去 30 天内下过订单的所有客户,并列出他们曾经下过的订单总数。

我用另一种 SQL fiddle尝试了一种方法。我正在尝试选择 TOP 3 客户及其订单总数,按订单日期排序。这不起作用,仅显示每个客户在截断的时间段内下达的订单数。

4

2 回答 2

1

我认为您对SELECT TOP (3)and有点困惑ORDER BY

使用附加WHERE子句进行初始查询;

SELECT customer_id, COUNT(order_id) AS num_orders 
FROM Customers 
LEFT JOIN Orders ON (customer_id = cust_id) 
WHERE order_date > DATE() - 30 // or desired equivalent
GROUP BY customer_id;

编辑

根据您的最新评论...

SELECT customer_id, COUNT(order_id) AS num_orders 
FROM Customers 
LEFT JOIN Orders ON (customer_id = cust_id) 
WHERE customer_id IN(SELECT TOP (3) [cust_id] FROM Orders ORDER BY [order_date] DESC)
GROUP BY customer_id

SQL小提琴

这将选择最近三个订单的 ID,并返回每个关联客户的订单总数。

于 2013-05-30T16:41:26.530 回答
1

“选择 TOP 3 客户及其订单总数,按订单日期排序”

为了根据TOP 3客户的订单数量获得客户,您首先需要"ORDER BY num_orders DESC". 在多个客户的订单数量排名第三的情况下,将其包括customer_idORDER BY决胜局中。

SELECT TOP 3
    sub.customer_id,
    sub.num_orders,
    sub.last_order_date
FROM
    (
        SELECT
            c.customer_id,
            Count(o.order_id) AS num_orders,
            Max(o.order_date) AS last_order_date
        FROM
            Customers AS c
            LEFT JOIN Orders AS o
            ON c.customer_id = o.cust_id
        WHERE o.order_date > Date() - 30
        GROUP BY c.customer_id
    ) AS sub
ORDER BY 2 DESC, 1;

这应该会给你前 3 名客户。如果您想查看它们按 排序last_order_date,请在子查询中使用该 sql 并应用于ORDER BY last_order_date子查询结果集。

根据您的评论,前 3 位客户是指最近下订单的 3 位客户。这实际上是一个更简单的查询,因为您只需要一个ORDER BY用于TOP 3排序顺序和最终排序顺序。将上面查询中的更改为ORDER BY...

ORDER BY 3 DESC, 1;

如果num_orders应该是自开始时间以来客户下的订单数量——即不仅仅是过去 30 天内下的订单——将此查询保存为Query1

SELECT TOP 3
    sub.cust_id,
    sub.last_order_date
FROM
    (
        FROM Orders AS o
        WHERE o.order_date > Date() - 30
        GROUP BY o.cust_id
    ) AS sub
ORDER BY 2 DESC, 1;

然后将此查询另存为Query2

SELECT
    o.cust_id,
    Count(o.order_id) AS num_orders
FROM Orders AS o
GROUP BY o.cust_id;

最后创建第三个查询,它将Query1Query2内部连接:Query1为您提供最近的 3 位客户和他们最后一次订购的日期;Query2为您提供每个客户下的所有订单的总数;将从Query2INNER JOIN返回的行过滤到仅存在于Query1中的那些客户。

于 2013-05-30T17:36:04.433 回答