SQL Server-查找订单最多的前n名客户
我想找到订单最多的前两位客户。SQL Server-查找订单最多的前n名客户,sql,sql-server,join,subquery,inner-join,Sql,Sql Server,Join,Subquery,Inner Join,我想找到订单最多的前两位客户。 该表如下所示: CustomerId OrderId ProductId 101 1 A 101 3 B 101 4 C 102 9 D 102 9 E 103 11 E 103 22 F 这是我从SELECT query中需要的输出: CustomerId Order
该表如下所示:
CustomerId OrderId ProductId
101 1 A
101 3 B
101 4 C
102 9 D
102 9 E
103 11 E
103 22 F
这是我从SELECT query中需要的输出:
CustomerId OrderId
101 1
101 3
101 4
103 11
103 22
解决的办法就是不点击我的脑海…我已经用下面的查询达到了一半-
SELECT CustomerId, OrderId
FROM dbo.CustomerOrder
GROUP BY CustomerId, OrderId
这给了我一对不同的CustomerId,OrderId
任何人都可以帮忙。试试这个:
with CustomerOrders as
(
select CustomerId, count(orderId) as NoOfOrders
from dbo.CustomerOrder
group by CustomerId
)
select top 2 * from CustomerOrders
order by NoOfOrders desc
SELECT c.CustomerId, c.OrderId
FROM CustomerOrder c
INNER JOIN
(SELECT TOP 2 WITH TIES CustomerId, COUNT(distinct OrderId) as Count
FROM CustomerOrder
GROUP BY CustomerId
ORDER BY Count DESC) b ON c.CustomerId = b.CustomerId
例如,您可以使用WITH TIES,如果您有3个客户具有相同的最大订单量,WITH TIES将检索这三个客户,如果没有这一点,您将让一个客户外出,这可能是错误的
选中此项我将使用子选择查找订单最多的客户。下面是一个工作示例:
DECLARE @orders AS TABLE(CustomerId INT, OrderId INT, ProductId VARCHAR(10))
INSERT INTO @orders VALUES(101, 1, 'A')
INSERT INTO @orders VALUES(101, 3, 'B')
INSERT INTO @orders VALUES(101, 4, 'C')
INSERT INTO @orders VALUES(102, 9, 'D')
INSERT INTO @orders VALUES(102, 9, 'E')
INSERT INTO @orders VALUES(103, 11, 'E')
INSERT INTO @orders VALUES(103, 22, 'F')
SELECT DISTINCT
O.CustomerId,
O.OrderId
FROM @orders O
JOIN (
SELECT TOP 2 CustomerId, COUNT(DISTINCT(OrderId)) as OrderCount
FROM @orders
GROUP BY CustomerId
ORDER BY COUNT(DISTINCT(OrderId)) DESC, CustomerId
) O2 ON O2.CustomerId = O.CustomerId
ORDER BY O.CustomerId, O.OrderId
在子选择中,我添加了一个二级排序,以在订单计数时打破联系。以下示例显示了以下代码的工作原理:
SELECT DISTINCT CO.CustomerId, CO.OrderID FROM
(
SELECT TOP(2) COS.CustomerId, COUNT(DISTINCT COS.orderId) as NoOfOrders
FROM custorders AS COS
GROUP BY COS.CustomerId
ORDER BY COUNT(DISTINCT COS.orderId) DESC, CustomerId DESC
) AS COM
INNER JOIN custorders AS CO
ON COM.CustomerId = CO.CustomerId
在您想要的结果中,101出现了3次,但您说您只想要前2名客户。请修正。因为我想显示前两位客户下的所有订单,如果第二位有两条记录会发生什么?你选择哪一个我不认为这个答案是正确的,尽管它确实产生了正确的结果。您可以通过切换客户102和103的订单来打破这个答案。问题是客户102只有一个订单(两条记录都是orderId 9),但此子选择将客户102视为有两个订单。@巴罗,你是对的,这不完全正确,我在计算时必须添加DISTINCT,因为:order BY COUNT(DISTINCT COS.orderId)我更新了我的答案以反映问题,如果订单id显示不止一次,您现在将得到正确的结果。@iniki我认为
COUNT(DISTINCT)
是一种方法。我更新了我的答案,使用了将查询限制为仅1个子选择的方法。似乎这不正确。它在查询结果中显示多个OrderID
s。这是显示问题的示例。+1您的解决方案也有效。;)我们都错过了相似的事情。是的,不管出于什么原因,这个问题比看起来要难一些。:)我也希望你的答案是正确的。
select customername from customers where customerid in
(select top 2 customerid from
(select count(*), customerid FROM orders
group by customerid
order by count(*) DESC))
SELECT customer.cust_name, order.order_amount
FROM customer inner join order
ON customer.cust_id = order.cust_id
ORDER BY order.order_amount DESC
select customerid,orderid from customerOrders
group by CustomerId,OrderId
having count(orderid) =1