2011-09-01 36 views
5

Por lo general, me siento bastante confiado con las consultas SQL, sin embargo, este me tiene a mí rascándome la cabeza. Siento que esto, debería ser una solución rápida, pero simplemente no lo estoy viendo.MySQL: ¿Cómo contar desde columnas por separado?

Estoy tratando de hacer un recuento de varios valores en la misma tabla, en una consulta.

No importa que "0000000000000000" solo represente una matriz de bytes vacía.

¿Hay alguna manera fácil de combinar estas consultas?

SELECT COUNT(ssn) 
FROM patients 
WHERE ssn="0000000000000000"; 

SELECT COUNT(firstname) 
FROM patients 
WHERE firstname="0000000000000000" 

SELECT COUNT(lastname) 
FROM patients 
WHERE lastname="0000000000000000" 

etc... 

Respuesta

2

Puede hacer algo como esto -

SELECT COUNT(ssn) AS patient_count, 'ssn' AS count_type 
FROM patients 
WHERE ssn="0000000000000000"; 
UNION 
SELECT COUNT(firstname) AS patient_count, 'firstname' AS count_type 
FROM patients 
WHERE firstname="0000000000000000" 
UNION 
SELECT COUNT(lastname) AS patient_count, 'lastname' AS count_type 
FROM patients 
WHERE lastname="0000000000000000" 
+0

¿Hay alguna manera en que pueda pivotar la mesa? Quiero decir que sería mejor tener mis fichas como encabezados, no como valores. – theangryhornet

+2

Puede poner UNION ALL en lugar de UNION, solo para ahorrarle al servidor SQL un poco de trabajo redundante. – James

1

intento con UNIÓN

SELECT COUNT(ssn) 
FROM patients 
WHERE ssn="0000000000000000"; 
UNION 
SELECT COUNT(firstname) 
FROM patients 
WHERE firstname="0000000000000000" 
UNION  
SELECT COUNT(lastname) 
FROM patients 
WHERE lastname="0000000000000000" 
+2

Desea usar 'UNION ALL' aquí. Si dos (o incluso los tres) recuentos son los mismos, 'UNION' los eliminaría como duplicados. –

+0

No estoy seguro si me gusta este, ya que no puede distinguir qué recuentos son cuáles. – theangryhornet

+0

podrías poner otra columna con la descripción para resolver este –

6
SELECT SUM(CASE WHEN ssn = '0000000000000000' THEN 1 ELSE 0 END) AS ssn_count, 
     SUM(CASE WHEN firstname = '0000000000000000' THEN 1 ELSE 0 END) AS first_count, 
     SUM(CASE WHEN lastname = '0000000000000000' THEN 1 ELSE 0 END) AS last_count 
    FROM patients 
    WHERE ssn = '0000000000000000' 
     OR firstname = '0000000000000000' 
     OR lastname = '0000000000000000' 
+0

Eso es bastante genial. ¿Cómo crees que se compara en rendimiento con las soluciones de "unión" a continuación? – Marvo

+3

@Marvo: Mi respuesta estándar es probar ambos y comparar. Supongo que esto sería mejor, ya que es 1 seleccionar contra 3. –

+0

enfoque muy interesante! – theangryhornet

1

supongo que esto funcionaría?

SELECT * 
FROM 
(SELECT COUNT(ssn) AS ssn_count 
FROM patients 
WHERE ssn="0000000000000000") AS ssn 
CROSS JOIN 
(SELECT COUNT(firstname) AS firstname_count 
FROM patients 
WHERE firstname="0000000000000000") AS firstname 
CROSS JOIN 
(SELECT COUNT(lastname) AS lastname_count 
FROM patients 
WHERE lastname="0000000000000000") AS lastname 
Cuestiones relacionadas