2012-07-09 2 views
27

voglio selezionare le chiavi distinte con il numero avvenimento, questa query sembra functionate:SQL COUNT * GROUP BY più grande di,

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
GROUP BY ItemMetaData.KEY 
ORDER BY count(*) desc; 

ma voglio anche per filtrare questi risultati, il che significa che voglio solo laddove conteggio (*) è superiore a 2500 così sarà mostrato solo più grande di 2500 occorrenza, ma:

SELECT * 
FROM 
(
    SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
    FROM ItemMetaData 
    GROUP BY ItemMetaData.KEY 
    ORDER BY count(*) desc 
) as result WHERE count(*)>2500; 

Ancora questa interrogazione si traduce in un errore di sintassi. Potete aiutarmi a raggiungere il mio requisito?

+0

Qualcuno ha appena cancellato il post voglio accettare, soddisfare ha scritto indietro e io lo accetterà "SELECT * FROM ( SELEZIONA ItemMetaData.KEY, ItemMetaData.VALUE, COUNT (*) 'ItemsCount' FROM ItemMetaData GROUP BY ItemMetaData.KEY ) sub WHERE sub.ItemsCount> 2500 ORDER BY sub.ItemsCount desc; " Anche aver funzionato e naturalmente tutte le altre risposte voteranno, grazie, ma ... – czupe

risposta

52

HAVING per gli aggregati

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
Group By ItemMetaData.KEY, ItemMetaData.VALUE 
HAVING count(*) > 2500 
ORDER BY count(*) desc; 
8

Si dovrebbe usare having con funzioni di gruppo invece di where. Es .:

select ..., count(*) from ... group by ... having count(*) > 2500; 
6

Non è necessario utilizzare un subquery - è sufficiente utilizzare un having clause invece di where clausola per filtrare da una colonna aggregata.

0

Questa è la spiegazione: la clausola WHERE introduce una condizione su singole righe; La clausola HAVING introduce una condizione sulle aggregazioni.

Utilizzare WHERE prima del GROUP BY e HAVING dopo il GROUP BY. Non è obbligatorio, ma di aiuto nella maggior parte dei casi.

SELECT 
     ItemMetaData.KEY, ItemMetaData.VALUE, СOUNT(*) 
FROM ItemMetaData 
GROUP BY 
     ItemMetaData.KEY, ItemMetaData.VALUE 
HAVING СOUNT(*) > 2500 
ORDER BY СOUNT(*) DESC;