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