2010-02-19 8 views
8

Mi rendo conto che è probabile che sia facile, ma il mio SQL è di base al meglio.Come contare i gruppi di righe e visualizzare la parte superiore/inferiore 3

Diciamo che ho una tabella contenente un elenco di ordini, con item_id che è una delle colonne. Devo visualizzare i 3 (o almeno 3) più popolari ordini di articoli.

So che ho bisogno di raggruppare gli ordini usando item_id e poi contarli. Poi ho bisogno di visualizzare il fondo (o superiore) 3 in ordine decrescente (o crescente). Non sono del tutto sicuro di come costruire una query del genere.

+0

Il mio inglese non è abbastanza per me capire "i 3 ordini più popolari di voce". Sono solo io? – Quassnoi

+0

Non solo tu. Penso che l'OP significasse qualcosa di più: "Devo mostrare i tre oggetti più ordinati". – bernie

+1

Benvenuti in StackOverflow. –

risposta

10

In Sql Server:

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

E aggiungere DESC ordinare discesa

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

ti darà l'intera lista.

inferiore 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: questo è sytnax per Oracle. Usa LIMIT se hai MySql o TOP se hai sql-server.

ORDER BY ordina i risultati. L'ordine crescente è quello predefinito, quindi usa 'desc' se vuoi ottenere il massimo.

GROUP BY (se utilizzato con count (*)) conterà gruppi di oggetti simili

dove rownum < 4: Questo è oracoli era di fare un limite. Restituisce le prime 3 righe della query che è stata eseguita. Dove le clausole vengono eseguite prima delle clausole di ordine, ecco perché è necessario farlo come query nidificata.

+0

Perché il downvote senza commenti? –

+0

@quassnoi: lo abbiamo modificato contemporaneamente: ho riavviato le tue modifiche, quindi le ho incluse con le mie in modo che il testo che ho aggiunto fosse lì. –

2

In MySQL:

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

Per il server SQL:

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

vi darà la

di item_id 3 più popolari utilizzando:

order by count(item_id) 

vi darà la 3 meno p opular di item_id

+0

Per quale dbms è questa risposta? –

+0

@David: 'SQL Server' – Quassnoi

Problemi correlati