varios varias valores mismo longitud contar condiciones condicion con caracteres campo cadena sql count conditional

valores - where con varias condiciones mysql



Cuenta condicional en un campo (8)

Necesitaría mostrar el ID de trabajo, nombre de trabajo y 5 campos llamados Prioridad1, Prioridad2, Prioridad3, Prioridad4. Prioridad5.

Algo está mal con el diseño de tu consulta. También está mostrando un trabajo específico en cada fila, y así tendrá una situación donde cada fila tiene cuatro columnas de prioridad con un ''0'' y una columna de prioridad con un ''1'' (la prioridad para ese trabajo) o terminarás repitiendo el conteo de todas las prioridades en cada fila.

¿Qué es lo que realmente quieres mostrar aquí?

Si tuviera una mesa como esta:

jobId, jobName, Priority

Por lo que la prioridad puede ser un número entero entre 1 y 5.

Como necesitaría esta consulta para generar un gráfico en el informe, tendría que mostrar el ID de trabajo, el nombre del trabajo y 5 campos llamados Prioridad1, Prioridad2, Prioridad3, Prioridad4. Prioridad5.

Prioridad1 debe contar la cantidad de filas donde el campo de prioridad tiene el valor de 1.

Prioridad2 debe contar la cantidad de filas donde el campo de prioridad tiene el valor de 2.

Prioridad3 debe contar la cantidad de filas donde el campo de prioridad tiene el valor de 3.

etc

¿Cómo haría eso de una manera rápida y eficaz?

Muchas gracias kave


Creo que puedes estar despues

select jobID, JobName, sum(case when Priority = 1 then 1 else 0 end) as priority1, sum(case when Priority = 2 then 1 else 0 end) as priority2, sum(case when Priority = 3 then 1 else 0 end) as priority3, sum(case when Priority = 4 then 1 else 0 end) as priority4, sum(case when Priority = 5 then 1 else 0 end) as priority5 from Jobs group by jobID, JobName

Sin embargo, no estoy seguro si necesita el ID de trabajo y el Nombre de trabajo en sus resultados, si es así, elimínelos y elimine el grupo.


El uso de COUNT en lugar de SUM elimina el requisito de una declaración ELSE:

SELECT jobId, jobName, COUNT(CASE WHEN Priority=1 THEN 1 END) AS Priority1, COUNT(CASE WHEN Priority=2 THEN 1 END) AS Priority2, COUNT(CASE WHEN Priority=3 THEN 1 END) AS Priority3, COUNT(CASE WHEN Priority=4 THEN 1 END) AS Priority4, COUNT(CASE WHEN Priority=5 THEN 1 END) AS Priority5 FROM TableName GROUP BY jobId, jobName


Podrías unirte a la mesa contra sí mismo:

select t.jobId, t.jobName, count(p1.jobId) as Priority1, count(p2.jobId) as Priority2, count(p3.jobId) as Priority3, count(p4.jobId) as Priority4, count(p5.jobId) as Priority5 from theTable t left join theTable p1 on p1.jobId = t.jobId and p1.jobName = t.jobName and p1.Priority = 1 left join theTable p2 on p2.jobId = t.jobId and p2.jobName = t.jobName and p2.Priority = 2 left join theTable p3 on p3.jobId = t.jobId and p3.jobName = t.jobName and p3.Priority = 3 left join theTable p4 on p4.jobId = t.jobId and p4.jobName = t.jobName and p4.Priority = 4 left join theTable p5 on p5.jobId = t.jobId and p5.jobName = t.jobName and p5.Priority = 5 group by t.jobId, t.jobName

O podrías usar caso dentro de una suma:

select jobId, jobName, sum(case Priority when 1 then 1 else 0 end) as Priority1, sum(case Priority when 2 then 1 else 0 end) as Priority2, sum(case Priority when 3 then 1 else 0 end) as Priority3, sum(case Priority when 4 then 1 else 0 end) as Priority4, sum(case Priority when 5 then 1 else 0 end) as Priority5 from theTable group by jobId, jobName


Prueba esto:

SELECT Count(Student_ID) as ''StudentCount'' FROM CourseSemOne where Student_ID=3 Having Count(Student_ID) < 6 and Count(Student_ID) > 0;


Usando las declaraciones CASE de ANSI SQL-92, podría hacer algo como esto (tabla derivada más caso):

SELECT jobId, jobName, SUM(Priority1) AS Priority1, SUM(Priority2) AS Priority2, SUM(Priority3) AS Priority3, SUM(Priority4) AS Priority4, SUM(Priority5) AS Priority5 FROM ( SELECT jobId, jobName, CASE WHEN Priority = 1 THEN 1 ELSE 0 END AS Priority1, CASE WHEN Priority = 2 THEN 1 ELSE 0 END AS Priority2, CASE WHEN Priority = 3 THEN 1 ELSE 0 END AS Priority3, CASE WHEN Priority = 4 THEN 1 ELSE 0 END AS Priority4, CASE WHEN Priority = 5 THEN 1 ELSE 0 END AS Priority5 FROM TableName )


IIF no es una construcción estándar de SQL, pero si es compatible con su base de datos, puede lograr una declaración más elegante produciendo el mismo resultado:

SELECT JobId, JobName, COUNT(IIF (Priority=1, 1, NULL)) AS Priority1, COUNT(IIF (Priority=2, 1, NULL)) AS Priority2, COUNT(IIF (Priority=3, 1, NULL)) AS Priority3, COUNT(IIF (Priority=4, 1, NULL)) AS Priority4, COUNT(IIF (Priority=5, 1, NULL)) AS Priority5 FROM TableName GROUP BY JobId, JobName


SELECT Priority, COALESCE(cnt, 0) FROM ( SELECT 1 AS Priority UNION ALL SELECT 2 AS Priority UNION ALL SELECT 3 AS Priority UNION ALL SELECT 4 AS Priority UNION ALL SELECT 5 AS Priority ) p LEFT JOIN ( SELECT Priority, COUNT(*) AS cnt FROM jobs GROUP BY Priority ) j ON j.Priority = p.Priority