Mis 2 soluciones para SQL 2005 están a continuación. Los otros que puedo ver hasta ahora pueden no devolver los datos correctos si dos de las cifras de ventas son las mismas. Eso depende de tus necesidades sin embargo.
El primero usa la función Row_Number(), todas las filas se clasifican desde las ventas más bajas hasta las más altas (luego algunas reglas de desempate). Luego, se elige el rango más alto por tienda para obtener el resultado.
Puede intentar agregar una cláusula Partion By a la función Row_Number (ver BOL) y/o investigar utilizando una unión interna en lugar de una cláusula "in".
El segundo, tomando prestado de la idea de Turnkey, los clasifica de nuevo, pero las particiones por tienda, para que podamos elegir el primero clasificado. Dense_Rank posiblemente dará dos filas idénticas del mismo rango, por lo que si la tienda y el departamento no fueran únicos, podría devolver dos filas. Con Row_number, el número es único en la partición.
Algunas cosas a tener en cuenta es que esto puede ser lento, pero sería más rápido para la mayoría de los conjuntos de datos que la sub consulta en una de las otras soluciones. En esa solución, la consulta debería ejecutarse una vez por fila (incluida la clasificación, etc.), lo que podría generar muchas consultas.
Otras consultas Seleccione las ventas máximas por tienda y devuelva los datos de esa manera, devuelva las filas duplicadas para una tienda si dos departamentos tienen las mismas ventas. La última consulta muestra esto.
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
¿Qué plataforma de la base de datos? ¿servidor SQL? ¿oráculo? – TheSoftwareJedi
que hubiera pensado que los fideos serían tan populares en Vancouver, ¿eh? – TheSoftwareJedi
Es "elegir un ganador" de nuevo. http://stackoverflow.com/questions/246870/simple-sql-query –