Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-查找订单最多的前n名客户_Sql_Sql Server_Join_Subquery_Inner Join - Fatal编程技术网

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