Sql server 使用“从一列中选择顶部”,然后在另一列上排序
我使用的是SQLServer2005,我想查询产生最多收入的供应商,按供应商名称排序。下面是我尝试过的问题。内部子查询按收入对15个最大的供应商进行排序,我尝试按供应商名称对这些结果进行排序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
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