2012-02-11 10 views
11

Tengo una tabla sencilla de instala:MySQL - ¿Cómo puedo contar nulos y no nulos?

  • prod_code
  • correo electrónico
  • install_slot

Si el install_slot es NULL, entonces se trata de una instalación disponible ranura. No nulo - entonces, tragamonedas usadas. Necesito devolver el resultado de las instalaciones totales para un producto y correo electrónico determinados, así como el resultado de las instalaciones usadas para un determinado producto y correo electrónico. Supongo que podría hacer esto con dos consultas, pero me pregunto si hay una forma de SQL para hacerlo todo en uno.

Intenté lo siguiente como una conjetura descabellada, pero no funcionó. Sólo

SELECT 
    i1.`prod_code`, 
    COUNT(i1.`email`) AS total_installs, 
    COUNT(ISNULL(i2.`install_slot`)) AS used_installs 
FROM 
    `installs` AS i1 
JOIN 
    `installs` AS i2 
ON 
    i1.`prod_code` = i2.`prod_code` 
WHERE 
    i1.`email` = '[email protected]' 
GROUP BY 
    i1.`prod_code`,i2.`prod_code` 
+1

No te entiendo, ligereza. ¿Qué parte de la oración con el signo de interrogación en ella, que comienza con "supongo", no lo comprende? – Volomike

+0

Nada de eso. No estoy hablando de esa frase, ¿o sí? –

+0

¿Eh? Todavía no te sigo. – Volomike

Respuesta

24
SELECT prod_code, 
     COUNT(email) AS total_installs, 
     COUNT(install_slot) AS used_installs 
FROM installs 
WHERE email='[email protected]' 
GROUP BY prod_code 

COUNT conteos NOT NULL valores.

+0

Wow. Me sorprende que en realidad funcionó. En mi opinión, me parece que no funcionaría, pero lo hace. – Volomike

+0

@Lightness Races in Orbit: ¿es también una mala costumbre decir 'funcionó'? –

3

La solución ofrecida no funcionó para mí. Tuve que modificar de la siguiente manera:

SELECT prod_code, 
     COUNT(NULLIF(email,'')) AS total_installs, 
     COUNT(NULLIF(install_slot,'')) AS used_installs 
FROM installs 
WHERE email='[email protected]' 
GROUP BY prod_code