Meine 2 Lösungen für SQL 2005 ist unten. Die anderen, die ich bisher gesehen habe, geben möglicherweise nicht die korrekten Daten zurück, wenn zwei der Verkaufszahlen gleich sind. Das hängt aber von Ihren Bedürfnissen ab.
Die erste verwendet die Row_Number() - Funktion, alle Zeilen werden von den niedrigsten bis zu den höchsten Verkäufen (dann einige Regeln zum Brechen von Zeilen) gereiht. Dann wird der höchste Rang pro Geschäft gewählt, um das Ergebnis zu erhalten.
Sie können versuchen, eine Partion By-Klausel zur Funktion Row_Number (siehe BOL) hinzuzufügen und/oder einen inneren Join statt einer In-Klausel zu untersuchen.
Die zweite, Leihgabe auf Turnkey-Idee, rangiert sie wieder, aber Partitionen nach Laden, so dass wir die erste Rangliste wählen können. Der Dense_Rank gibt möglicherweise zwei identische Zeilen mit dem gleichen Rang an. Wenn also Filiale und Abteilung nicht eindeutig sind, könnten zwei Zeilen zurückgegeben werden. Mit Zeilennummer ist die Nummer in der Partition eindeutig.
Einige Dinge zu beachten ist, dass dies langsam sein kann, aber für die meisten Datensätze schneller als die Unterabfrage in einer der anderen Lösungen wäre. In dieser Lösung müsste die Abfrage einmal pro Zeile ausgeführt werden (einschließlich Sortierung usw.), was zu vielen Abfragen führen könnte.
Andere Abfragen die maximale Verkäufe pro Geschäft auswählen und die Daten auf diese Weise zurückgeben, doppelte Zeilen für ein Geschäft zurückgeben, wenn zwei Abteilungen die gleichen Verkäufe haben. Die letzte Abfrage zeigt dies.
DECLARE @tbl as TABLE (store varchar(20), department varchar(20), sales int)
INSERT INTO @tbl VALUES ('Toronto', 'Baskets', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Noodles', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Baskets', 200)
-- Expect Toronto/Noodles/500 and Halifax/Fish/300
;WITH ranked AS -- Rank the rows by sales from 1 to x
(
SELECT
ROW_NUMBER() OVER (ORDER BY sales, store, department) as 'rank',
store, department, sales
FROM @tbl
)
SELECT store, department, sales
FROM ranked
WHERE rank in (
SELECT max(rank) -- chose the highest ranked per store
FROM ranked
GROUP BY store
)
-- Another way
SELECT store, department, sales
FROM (
SELECT
DENSE_RANK() OVER (PARTITION BY store ORDER BY sales desc,
store desc, department desc) as 'rank',
store, department, sales
FROM @tbl
) tbl
WHERE rank = 1
-- This will bring back 2 rows for Toronto
select tbl.store, department, sales
from @tbl tbl
join (
select store, max(sales) as maxSales from @tbl group by store
) tempTable on tempTable.store = tbl.store
and tempTable.maxSales = tbl.sales
Welche Datenbankplattform? SQL Server? Orakel? – TheSoftwareJedi
Wer hätte gedacht, dass Nudeln in Vancouver so beliebt sind, oder? – TheSoftwareJedi
Es ist wieder "Gewinner". http://stackoverflow.com/questions/246870/simple-sql-query –