sqlserver:如何返回最高的agregated列

j2cgzkjk  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(269)

我能返回两个最高的聚合结果吗?
例如,我有这样一个结果:

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

我需要返回最多2行,如下所示:

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

我试过了 TOP 2 ,但问题是,如果存在具有相同值的行,我不知道如何返回更多行。
这是我目前的问题

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;
0ejtzxu1

0ejtzxu11#

你想要什么 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 从customers表开始,然后转到orders表。也不清楚为什么有一个名为 CustomerId ,具有同名的列。理想情况下,您可以命名该表 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;
h22fl7wq

h22fl7wq2#

首先,不需要外部连接,除非您的数据模型真的很混乱。
你可以用 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;

相关问题