Si j'avais une table comme celle-ci:
jobId, jobName, Priority
La priorité peut être un entier compris entre 1 et 5.
Étant donné que j'aurais besoin de cette requête pour générer un graphique sur le rapport, j'aurais besoin d'afficher le jobid, le nom du travail et 5 champs appelés Priority1, Priority2, Priority3, Priority4. Priorité 5.
Priority1 doit compter le nombre de lignes où le champ prioritaire a la valeur 1.
Priority2 doit compter le nombre de lignes où le champ prioritaire a la valeur 2.
Priority3 doit compter le nombre de lignes où le champ prioritaire a la valeur 3.
etc
Comment pourrais-je faire cela d'une manière rapide et performante?
Merci beaucoup, Kave
Je pense que tu peux être après
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
Cependant, je ne suis pas certain que vous ayez besoin de jobID et JobName dans vos résultats, le cas échéant, supprimez-les et supprimez le groupe par,
L'utilisation de COUNT au lieu de SUM supprime l'exigence d'une instruction 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
IIF
n'est pas une construction SQL standard, mais si elle est prise en charge par votre base de données, vous pouvez obtenir une instruction plus élégante produisant le même résultat:
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
En utilisant des instructions CASE ANSI SQL-92, vous pouvez faire quelque chose comme ceci (tableau dérivé plus cas):
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
)
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
Vous pouvez rejoindre la table contre elle-même:
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
Ou vous pouvez utiliser la casse dans une somme:
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