Sql server 使用“从一列中选择顶部”,然后在另一列上排序

Sql server 使用“从一列中选择顶部”,然后在另一列上排序,sql-server,syntax,subquery,Sql Server,Syntax,Subquery,我使用的是SQLServer2005,我想查询产生最多收入的供应商,按供应商名称排序。下面是我尝试过的问题。内部子查询按收入对15个最大的供应商进行排序,我尝试按供应商名称对这些结果进行排序 SELECT Revenue, VendorName FROM ( SELECT TOP 15 SUM(po.POTotal) AS Revenue , Vendors.VendorName AS VendorName FROM PurchaseOrders po

我使用的是SQLServer2005,我想查询产生最多收入的供应商,按供应商名称排序。下面是我尝试过的问题。内部子查询按收入对15个最大的供应商进行排序,我尝试按供应商名称对这些结果进行排序

SELECT Revenue, VendorName
FROM (
  SELECT TOP 15
         SUM(po.POTotal) AS Revenue
       , Vendors.VendorName AS VendorName
  FROM PurchaseOrders po
  INNER JOIN Vendors ON po.Vendor_ID = Vendors.Vendor_ID
  WHERE ...
  GROUP BY Vendors.VendorName
  ORDER BY Revenue DESC
)
ORDER BY VendorName ASC
但这给了我一个错误信息:

味精156,第15级,状态1,第14行
关键字“ORDER”附近的语法不正确

还有别的办法吗?我认为从一个角度来看这是可能的,但我不想这样做



很抱歉,如果这是重复的,我甚至不知道要搜索什么以查看是否已询问过此问题。

为子查询添加别名:

SELECT Revenue, VendorName
FROM (SELECT TOP 15         
        SUM(po.POTotal) AS Revenue, 
        v.VendorName AS VendorName  
      FROM PurchaseOrders po  
        JOIN Vendors v 
          ON po.Vendor_ID = v.Vendor_ID 
      WHERE ... 
      GROUP BY v.VendorName  
      ORDER BY Revenue DESC) Z
ORDER BY VendorName ASC

您需要为派生表提供一个别名:

  ...
  ORDER BY Revenue DESC
) AS DerivedTable
ORDER BY VendorName;

我相信您可以通过CTE实现这一点:

WITH revenue (Revenue, VendorName)
AS
(SELECT TOP 15 SUM(po.POTotal) AS Revenue, Vendors.VendorName AS VendorName  
FROM PurchaseOrders po  
INNER JOIN Vendors 
ON po.Vendor_ID = Vendors.Vendor_ID  
WHERE ...  
GROUP BY Vendors.VendorName  
ORDER BY Revenue DESC)
SELECT Revenue, VendorName
FROM revenue
ORDER BY VendorName ASC

如果愿意,也可以不使用子查询来完成此操作--


尝试一下,看看它是否有效-我们在这里做同样的事情,这是我们的解决方案…

对不起,忘记了上面查询中的前15个-它需要在sum()聚合函数之前运行。

谢谢,这也有效。不过,我还是坚持使用其他语法,更清楚一点,我是不起作用的。仅当两个供应商共享完全相同的订单总数时,才会按供应商名称进行二次排序(这种情况很少发生)
SELECT sum(po.POTotal) as Revenue, vendors.VendorName
FROM   PurchaseOrders po  INNER JOIN Vendors ON po.Vendor_ID = Vendors.Vendor_ID  
WHERE ...  
GROUP BY Vendors.VendorName  
ORDER BY sum(po.POTotal) DESC, VendorName ASC