Nombre conditionnel sur un champ

Si j’avais une table comme celle-ci:

jobId, jobName, Priority 

Whereby Priority 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 dans le rapport, je devrais afficher le jobid, le nom du travail et 5 champs appelés Priority1, Priority2, Priority3, Priority4. Priorité5.

Priority1 doit compter la quantité de lignes dont le champ de priorité a la valeur 1.

Priority2 doit compter le nombre de lignes dont le champ de priorité a la valeur 2.

Priority3 doit compter le nombre de lignes où le champ de priorité a la valeur 3.

etc

Comment pourrais-je le faire d’une manière rapide et performante?

Merci beaucoup, Kave

Je pense que vous pouvez ê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 sais pas si vous avez besoin du jobID et du JobName dans vos résultats si vous les supprimez et supprimez le groupe,

L’utilisation de COUNT au lieu de SUM supprime la nécessité 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 

En utilisant les instructions CASE ANSI SQL-92, vous pouvez faire quelque chose comme ceci (table dérivée 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 ) 

IIF n’est pas une construction SQL standard, mais si elle est prise en charge par votre firebase database, vous pouvez obtenir une déclaration 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 
 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 pourriez 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 pourriez utiliser un cas dans une sum:

 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 

Je devrais afficher le jobid, le nom de travail et 5 champs appelés Priority1, Priority2, Priority3, Priority4. Priorité5.

Quelque chose ne va pas avec votre conception de requête. Vous affichez également un travail spécifique dans chaque ligne, et vous aurez donc une situation dans laquelle chaque ligne comporte quatre colonnes de priorité avec une colonne “0” et une colonne de priorité avec un “1” (priorité de ce travail). ou vous finirez par répéter le compte pour toutes les priorités sur chaque ligne.

Qu’est-ce que tu veux vraiment montrer ici?

SELECT Count (Student_ID) comme ‘StudentCount’ FROM CourseSemOne où Student_ID = 3 ayant un compte (Student_ID) <6 et Count (Student_ID)> 0;