es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usar SQL para contar sí y no en múltiples columnas en MySQL.

Tengo algunos datos, ¿hay un método simple?

create table tb_count(
    id int not null auto_increment,
    col1 enum('yes', 'no'),
    col2 enum('yes', 'no'),
    col3 enum('yes', 'no'),
    col4 enum('yes', 'no'),
    primary key(id)
) default charset=utf8;

insert into tb_count values (null, 'yes', 'yes', 'no', 'yes');
insert into tb_count values (null, 'no', 'yes', 'no', 'no');
insert into tb_count values (null, 'no', 'yes', 'no', 'yes');
insert into tb_count values (null, 'no', 'no', 'no', 'no');

select * from tb_count;

descripción de la imagen aquí


<h1>Quiero obtener la siguiente salida:</h1> <h1>valor col1 col2 col3 col4</h1> <h1>yes 1 3 0 2</h1> <h1>no 3 1 4 2</h1>

Por cierto, tengo un método más complicado, no quiero usar union all.

Mi código


SELECT 'yes' AS 'valor', SUM( CASE WHEN col1 = 'yes' THEN 1 ELSE 0 END ) AS col1, SUM( CASE WHEN col2 = 'yes' THEN 1 ELSE 0 END ) AS col2, SUM( CASE WHEN col3 = 'yes' THEN 1 ELSE 0 END ) AS col3, SUM( CASE WHEN col4 = 'yes' THEN 1 ELSE 0 END ) AS col4 FROM tb_count UNION ALL SELECT 'no' AS 'valor', SUM( CASE WHEN col1 = 'no' THEN 1 ELSE 0 END ) AS col1, SUM( CASE WHEN col2 = 'no' THEN 1 ELSE 0 END ) AS col2, SUM( CASE WHEN col3 = 'no' THEN 1 ELSE 0 END ) AS col3, SUM( CASE WHEN col4 = 'no' THEN 1 ELSE 0 END ) AS col4 FROM tb_count

Quería saber si es buena práctica hacer eso y cuál sería la mejor forma de hacerlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes utilizar el siguiente código:

    SELECT 
       CASE 
          WHEN col1 = 'yes' THEN 'yes' 
          WHEN col1 = 'no' THEN 'no' 
       END AS value,
       SUM(CASE WHEN col1 = 'yes' THEN 1 ELSE 0 END) as col1,
       SUM(CASE WHEN col2 = 'yes' THEN 1 ELSE 0 END) as col2,
       SUM(CASE WHEN col3 = 'yes' THEN 1 ELSE 0 END) as col3,
       SUM(CASE WHEN col4 = 'yes' THEN 1 ELSE 0 END) as col4
    FROM 
       tb_count
    GROUP BY 
       CASE 
          WHEN col1 = 'yes' THEN 'yes' 
          WHEN col1 = 'no' THEN 'no' 
       END
    

    Este código utiliza una cláusula GROUP BY para agrupar los resultados según los valores de col1. La declaración CASE se utiliza para transformar los valores de col1 en el formato deseado.

    En cuanto a tu método más complicado que utiliza UNION ALL, es un enfoque válido y puede ser utilizado en casos donde hay solo unos pocos valores distintos. Sin embargo, para un mayor número de valores distintos, este enfoque puede volverse engorroso y difícil de leer. El enfoque de GROUP BY generalmente es más flexible y eficiente.

Comments are closed.