2012-07-07 23 views
14

que tienen una tabla que se ve algo como esto:SQL - filas contando con valor específico

id value 
1 0 
1 1 
1 2 
1 0 
1 1 
2 2 
2 1 
2 1 
2 0 
3 0 
3 2 
3 0 

Ahora para cada id, quiero contar el número de ocurrencias de 0 y 1, y el número de ocurrencias de Identificación de que (el valor puede ser cualquier número entero), por lo que el resultado final debe ser algo como esto:

id n0 n1 total 
1 2 2 5 
2 1 2 4 
3 2 0 3 

he conseguido la primera y última fila con esta declaración:

SELECT id, COUNT(*) FROM mytable GROUP BY id; 

Pero estoy algo perdido desde aquí. ¿Alguna sugerencia sobre cómo lograr esto sin una gran declaración?

Respuesta

26

Con MySQL, puede utilizar SUM(condition):

SELECT id, SUM(value=0) AS n0, SUM(value=1) AS n1, COUNT(*) AS total 
FROM  mytable 
GROUP BY id 

verlo en sqlfiddle.

+1

¡Dulce, ni siquiera sabía que había un 'SUM (condición)'! – ryyst

+2

@ryyst: Bueno, es un truco que aprovecha el hecho de que MySQL evalúa los resultados booleanos de las expresiones condicionales a 0 si es falso y 1 si es verdadero; de modo que tomar la 'SUMA 'sobre cada grupo proporciona un recuento de aquellos registros donde la condición es verdadera. – eggyal

+7

También podría ser más expresivo y usar 'COUNT (CASE WHEN value = 0 THEN 1 END) AS n0, ..., ...', que funcionará en todos los demás DBMS importantes ya que MySQL es el único que hace implícito conversiones booleanas. Ver mi [pregunta aquí] (http://stackoverflow.com/questions/11340540/conditional-counting-performance-differences-in-using-sum-vs-count) para más información. –

0

Como @Zane comentó anteriormente, el método típico es usar expresiones CASE para realizar el pivote.

SQL Server ahora tiene un operador PIVOT que puede ver. DECODE() y IIF() eran enfoques más antiguos en Oracle y Access que todavía podría encontrar por ahí.

Cuestiones relacionadas