Używam bazy danych Northwind do odświeżania moich umiejętności SQL poprzez tworzenie bardziej lub mniej złożonych zapytań. Niestety nie mogłem znaleźć rozwiązania dla mojego ostatniego przypadku użycia: "Zdobądź pięć największych zamówień dla każdej kategorii w roku 1997."SQL - Podzapytowanie w funkcji agregującej
Tabele zaangażowane są:
Orders(OrderId, OrderDate)
Order Details(OrderId, ProductId, Quantity, UnitPrice)
Products(ProductId, CategoryId)
Categories(CategoryId, CategoryName)
Próbowałem następujące zapytanie
SELECT c.CategoryName, SUM(
(SELECT TOP 5 od2.UnitPrice*od2.Quantity
FROM [Order Details] od2, Products p2
WHERE od2.ProductID = p2.ProductID
AND c.CategoryID = p2.CategoryID
ORDER BY 1 DESC))
FROM [Order Details] od, Products p, Categories c, Orders o
WHERE od.ProductID = p. ProductID
AND p.CategoryID = c.CategoryID
AND od.OrderID = o.OrderID
AND YEAR(o.OrderDate) = 1997
GROUP BY c.CategoryName
Cóż ... Okazało się, że podzapytania nie są dozwolone w funkcji agregujących. Czytałem inne posty na ten temat, ale nie mogłem znaleźć rozwiązania dla mojego konkretnego przypadku użycia. Mam nadzieję, że możesz mi pomóc ...
Z której wersji RDBMS korzystasz? Również twoje pytanie nie jest poprawne, ponieważ zamówienie może należeć do więcej niż jednej kategorii. –
Używam MSSQL 2012. Jeśli odwołujesz się do podzapytania, istnieje klauzula WHERE - "WHERE c.categoryID = p2.CategoryID" - która powinna filtrować tylko dla jednej kategorii. – Thomas