SQL 服务器:如何 return 最高聚合列

SQL Server : how to return highest agregated columns

我可以 return 两个最高的聚合结果吗?

例如,我有这样的结果:

CustomerId   Total
---------------------
    5        1100.00
   n/a        100.00
    7         100.00
    6           0.00

我需要 return 最多 2 行这样的:

CustomerId    Total
-----------------------
    5         1100.00
    7          100.00
   n/a         100.00

我尝试使用 TOP 2,但问题是我不知道如果存在具有相同值的行,我如何才能 return 更多行。

这是我目前的查询

SELECT
    ISNULL(CONVERT(varchar(50), u.CustomerId), 'not found') CustomerId ,
    ISNULL(SUM(o.Total), 0.00) Total
FROM 
    Orders o 
FULL OUTER JOIN 
    CustomerId u ON u.UserId = o.UserId
GROUP BY
    u.CustomerId 
ORDER BY 
    Total DESC;

你要WITH TIES吗?

SELECT TOP (2) WITH TIES
    ISNULL(CONVERT(varchar(50), u.CustomerId), 'not found') CustomerId ,
    ISNULL(SUM(o.Total), 0.00) Total
FROM Orders o 
FULL OUTER JOIN CustomerId u ON u.UserId = o.UserId
GROUP BY u.CustomerId 
ORDER BY total desc;

目前还不清楚您为什么需要 FULL JOIN。除非您有孤立订单,否则应该 LEFT JOIN 从客户 table 开始,然后转到订单 table。还不清楚为什么您有一个名为 CustomerId 的 table,其中一个列具有相同的名称。理想情况下,您应该将其命名为 table Customers,因此:

SELECT TOP (2) WITH TIES
    c.CustomerId
    ISNULL(SUM(o.Total), 0.00) Total
FROM Customers c
LEFT JOIn Orders o ON u.UserId = c.UserId
GROUP BY c.CustomerId 
ORDER BY total desc;

首先,外连接不是必需的,除非你的数据模型真的很乱。

您可以使用 TOP 2 WITH TIES:

SELECT TOP (2) WITH TIES u.CustomerId, SUM(o.Total)
FROM Orders o JOIN
     CustomerId u 
     ON u.UserId = o.UserId
GROUP BY u.CustomerId 
Order by Total desc;