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;
<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?
davy.ai
Para obtener el resultado deseado, puedes utilizar el siguiente código:
Este código utiliza una cláusula
GROUP BY
para agrupar los resultados según los valores decol1
. La declaraciónCASE
se utiliza para transformar los valores decol1
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 deGROUP BY
generalmente es más flexible y eficiente.