我有由 customer_id 相关的 CUSTOMERS 和 ORDERS 表。我只想获取每个客户已下订单的数量。我成功使用了这个示例sqlfiddle 。
但是,记录集很大,我只想将每个客户的记录总数限制为最近更改了该数字的记录。一种可能的解决方案是列出过去 30 天内下过订单的所有客户,并列出他们曾经下过的订单总数。
我用另一种 SQL fiddle尝试了一种方法。我正在尝试选择 TOP 3 客户及其订单总数,按订单日期排序。这不起作用,仅显示每个客户在截断的时间段内下达的订单数。
我有由 customer_id 相关的 CUSTOMERS 和 ORDERS 表。我只想获取每个客户已下订单的数量。我成功使用了这个示例sqlfiddle 。
但是,记录集很大,我只想将每个客户的记录总数限制为最近更改了该数字的记录。一种可能的解决方案是列出过去 30 天内下过订单的所有客户,并列出他们曾经下过的订单总数。
我用另一种 SQL fiddle尝试了一种方法。我正在尝试选择 TOP 3 客户及其订单总数,按订单日期排序。这不起作用,仅显示每个客户在截断的时间段内下达的订单数。
我认为您对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
这将选择最近三个订单的 ID,并返回每个关联客户的订单总数。
“选择 TOP 3 客户及其订单总数,按订单日期排序”
为了根据TOP 3
客户的订单数量获得客户,您首先需要"ORDER BY num_orders DESC"
. 在多个客户的订单数量排名第三的情况下,将其包括customer_id
在ORDER 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;
最后创建第三个查询,它将Query1与Query2内部连接:Query1为您提供最近的 3 位客户和他们最后一次订购的日期;Query2为您提供每个客户下的所有订单的总数;将从Query2INNER JOIN
返回的行过滤到仅存在于Query1中的那些客户。