SQL显示count中的第一个和最后一个值

问题描述 投票:0回答:3

我需要编写一个查询,显示客户订单的最大和最小订单数。

我试过了:

(SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
FROM Orders
GROUP BY CustomerID
ORDER BY COUNT(*) ASC)

UNION ALL

(SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
FROM Orders
GROUP BY CustomerID
ORDER BY COUNT(*) DESC)

但我没有成功输出输出,我得到了错误Incorrect syntax near the keyword 'ORDER'

我怎么能得到它?

sql sql-server tsql aggregate-functions northwind
3个回答
5
投票

我不确定我是否想要运行聚合两次,所以使用窗口函数:

SELECT CustomerID, Number_Of_Orders
FROM (SELECT CustomerID, COUNT(*) AS Number_Of_Orders,
             ROW_NUMBER() OVER (ORDER BY COUNT(*) ASC) as seqnum_asc,
             ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum_desc
      FROM Orders
      GROUP BY CustomerID
     ) c
WHERE seqnum_asc = 1 OR seqnum_desc = 1;

1
投票

您不能在要与ORDER BY统一的查询中使用UNION,但您可以这样做:

SELECT * FROM
  (SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
  FROM Orders
  GROUP BY CustomerID
  ORDER BY COUNT(*) ASC) t
UNION ALL
SELECT * FROM
  (SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
  FROM Orders
  GROUP BY CustomerID
  ORDER BY COUNT(*) DESC) t

这样做虽然效率很低,但是因为你执行两次相同的代码并排序两次。


1
投票

您可以使用窗口功能。如果有联系(fiddle),这将为您提供最多/最大的多个客户:

SELECT CustomerID
     , OrderCount
     , CASE WHEN OrderCount = MinOrderCount THEN 'Customer with min orders'
            WHEN OrderCount = MaxOrderCount THEN 'Customer with max orders' END AS Type
FROM (
    SELECT CustomerID
         , COUNT(*) AS OrderCount
         , MIN(COUNT(*)) OVER () AS MinOrderCount
         , MAX(COUNT(*)) OVER () AS MaxOrderCount
    FROM Orders
    GROUP BY CustomerID
) AS x
WHERE OrderCount = MinOrderCount OR OrderCount = MaxOrderCount
© www.soinside.com 2019 - 2024. All rights reserved.