Использование SELECT TOP из одного столбца, затем сортировка по другому столбцу - PullRequest
2 голосов
/ 11 ноября 2009

Я использую SQL Server 2005 и хочу запросить поставщиков, приносящих наибольшую прибыль, отсортированных по имени поставщика. Ниже приведен запрос, который я пробовал. Внутренний подзапрос сортирует 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».

Есть ли другой способ сделать это? Я думаю, что это может быть возможно с точки зрения, но я бы предпочел не делать это таким образом.


Я прошу прощения, если это дубликат, я даже не знаю, что искать, чтобы увидеть, если это уже спрашивали.

Ответы [ 5 ]

8 голосов
/ 11 ноября 2009

Добавьте псевдоним для подзапроса:

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
5 голосов
/ 11 ноября 2009

Вам нужно дать вашей производной таблице псевдоним:

  ...
  ORDER BY Revenue DESC
) AS DerivedTable
ORDER BY VendorName;
1 голос
/ 11 ноября 2009

Полагаю, вы можете сделать это с помощью 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
0 голосов
/ 11 ноября 2009

Извините, забыл ТОП-15 в запросе выше - он должен идти только для агрегатной функции sum ().

0 голосов
/ 11 ноября 2009

Вы также можете сделать это без подзапроса, если хотите -

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

Попробуйте и посмотрите, работает ли это - мы делаем то же самое здесь, и это было наше решение ...

...