2010-02-19 5 views
8

Me doy cuenta de que es probable que sea fácil, pero mi SQL es básico en el mejor de los casos.Cómo contar grupos de filas y mostrar la parte superior/inferior 3

Digamos que tengo una tabla que contiene una lista de pedidos, siendo item_id una de las columnas. Necesito mostrar los 3 pedidos de artículos más populares (o 3 más populares).

Sé que tengo que agrupar los pedidos usando item_id y luego contarlos. Entonces necesito mostrar la parte inferior (o superior) 3 en orden descendente (o ascendente). No estoy del todo seguro de cómo crear una consulta como esa.

+0

Mi Inglés no es suficiente para mí entender "los 3 órdenes más populares de partida". ¿Se trata sólo de mí? – Quassnoi

+0

No solo usted. Creo que el OP significaba algo así como: "Necesito mostrar los tres artículos más pedidos". – bernie

+1

Bienvenido a StackOverflow. –

Respuesta

10

En servidor SQL:

SELECT TOP 3 item_id, COUNT(*) as itemcount 
FROM table 
GROUP BY item_id ORDER BY itemcount 

Y DESC añadir a la orden de descenso

3
select item_id, count(*) 
from table 
group by item_id; 

le dará la lista completa.

fondo 3:

select item_id 
from (
    select item_id, count(*) as cnt 
    from table 
    group by item_id 
    order by cnt 
) where rownum < 4; 

Top 3:

select item_id 
from (
    select item_id, count(*) as cnt 
    from table 
    group by item_id 
    order by cnt desc 
) where rownum < 4; 

NOTA: este es sytnax para Oracle. Use LIMIT si tiene MySql o TOP si tiene sql-server.

ORDER BY ordenará los resultados. El orden ascendente es el predeterminado, por lo tanto, use 'desc' si desea obtener el más grande.

GROUP BY (cuando se utiliza con la cuenta (*)) contará grupos de objetos similares

donde rownum < 4: Este es oráculos era de hacer un límite. Devuelve las primeras 3 filas de la consulta que se ha ejecutado. Donde las cláusulas se ejecutan antes de las cláusulas de orden, por eso es que tiene que hacer esto como una consulta anidada.

+0

¿Por qué la votación negativa sin comentarios? –

+0

@quassnoi: lo editamos al mismo tiempo: rodé tus ediciones hacia atrás, luego las incluí con las mías para que el texto que agregué estuviera allí. –

2

En MySQL:

SELECT item_id, COUNT(*) AS cnt 
FROM orders 
GROUP BY 
     item_id 
ORDER BY 
     cnt DESC 
LIMIT 3 
3

Para el servidor SQL:

select top 3 item_id, count(item_id) 
from  table 
group by item_id 
order by count(item_id) desc 

te dará la

de item_id 3 más populares usando:

order by count(item_id) 

te dará la 3 menos p opular de item_id

+0

¿Para qué dbms es esta respuesta? –

+0

@David: 'SQL Server' – Quassnoi

Cuestiones relacionadas