2009-08-17 8 views
47

Si j'avais une table comme ceci:Count conditionnel sur un champ

jobId, jobName, Priority 

priorité peut être Par lequel un nombre entier compris entre 1 à 5.

Depuis que je aurais besoin de cette requête pour générer un graphique sur le rapport , J'aurais besoin d'afficher le jobid, jobname et 5 champs appelés Priority1, Priority2, Priority3, Priority4. Priorité5.

Priorité1 doit compter le nombre de lignes où le champ de priorité a la valeur de 1.

Priorité2 doit compter le nombre de lignes où le champ de priorité a la valeur de 2.

Priorité3 devrait compter le montant de les lignes où le champ de priorité a la valeur de 3.

etc

Comment puis-je faire cela d'une manière rapide et performant?

Merci beaucoup, Kave

+0

avez-vous plusieurs enregistrements pour un seul ID de travail? si jobid 1 peut être dans la table 10 fois, toutes avec des priorités différentes? aussi, quelle base de données utilisez-vous? serveur SQL? mysql? –

Répondre

87

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 suis pas sûr si vous avez besoin du jobID et du JobName dans vos résultats, si c'est le cas, supprimez-les et supprimez le groupe par,

1
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 
-1

je besoin d'afficher JobId, jobname et 5 champs appelés Priorité1, Priorité2, Priorité3, Priority4. Priorité5.

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

Que voulez-vous vraiment montrer ici?

4

utilisant ANSI SQL-92 Argumentaires, vous pourriez faire quelque chose comme ça (la table dérivée en plus le 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 


) 
1

Vous pouvez joindre la table contre lui-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 le cas à l'intérieur d'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 
59

des numérations au lieu de SUM supprime l'exigence d'une déclaration 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 
+0

Cela fonctionne, mais produit: Avertissement: La valeur nulle est éliminée par un agrégat ou une autre opération SET. – tukushan

2

IIF est pas une construction standard SQL, mais s'il est supporté par votre base de données, 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 
-1

SELECT Count (ID_étudiant) en tant que 'StudentCount' FROM CourseSemOne où ID_étudiant = 3 Nombre (Student_ID) < 6 et nombre (ID_étudiant)> 0;

+1

Puisqu'il s'agit d'une réponse complètement fausse, s'il vous plaît nous faire une faveur et l'enlever – guyarad