2012-07-09 11 views
27

Quiero seleccionar las teclas distintas con el número de ocurrencia, esta consulta parece funcionar:SQL COUNT * GRUPO POR grande que,

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

pero también quiero filtrar estos resultados, lo que significa que sólo cuando el recuento quiero (*) es superior a 2500 por lo que se muestra sólo que más grande de 2500 ocurrencia, pero:

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

Por desgracia, esta consulta da como resultado un error de sintaxis. ¿Me puedes ayudar a cumplir mi requisito?

+0

Alguien acaba de eliminar el post que desea aceptar, por favor escribió de nuevo y voy a aceptarlo "SELECT * DE ( SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count (*) 'ItemsCount' FROM ItemMetaData GROUP BY ItemMetaData.KEY ) sub WHERE sub.ItemsCount> 2500 ORDER BY sub.ItemsCount desc; " Tener también está funcionando y, naturalmente, todas las otras respuestas votarán, gracias, pero ... – czupe

Respuesta

52

HAVING para los agregados

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

Debe utilizar having con funciones de grupo en lugar de where. Ej .:

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

No es necesario utilizar una subconsulta - sólo tiene que utilizar un having clause en lugar de where cláusula para filtrar por una columna agregada.

SELECT 
ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
GROUP BY ItemMetaData.KEY 
HAVING count(*) > 2500 
ORDER BY count(*) desc 
0

Aquí está la explicación: WHERE cláusula introduce una condición en filas individuales; HAVING cláusula introduce una condición en agregaciones.

Usa WHERE antes GROUP BY y HAVING después de GROUP BY. No es obligatorio, pero es útil en la mayoría de los casos.

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