1 votes

Informations sur les comparaisons count() SQL d'Informix

Je suis en train de construire une requête SQL qui comptera à la fois le nombre total de lignes pour chaque id, et le nombre de notes 'FN%' et 'W%' regroupées par id. Si ces nombres sont égaux, alors l'élève a soit toutes les notes 'FN%', soit toutes les notes 'W%', soit une combinaison des deux.

J'ai besoin d'une liste de tous les id qui n'ont que des stats 'FN%' ou 'W%'

Par exemple, l'id # 683 & 657 feraient partie de l'ensemble de résultats de la requête, mais 603, 781 & 694 ne le seraient pas

   id stat
  683 WF
  683 WF
  683 WF
  683 WF
  683 W
  683 W
  657 W
  657 W
  657 W
  657 W
  781 B+
  781 IP
  781 WP
  781 WP
  603 FN
  603 FN
  603 F
  603 FN
  603 FN
  694 B
  694 B+
  694 CI
  694 LAB
  694 WF
  694 WF

exemple de sortie:

683
657

3voto

yukondude Points 8756

Voici deux solutions possibles auxquelles je pense. Je ne suis pas sûr qu'elles fonctionneront dans Informix:

SELECT  id
FROM    foo a
GROUP   BY id
HAVING  COUNT(*) = (
                SELECT  COUNT(*)
                FROM    foo b
                WHERE   a.id = b.id
                AND     (b.stat LIKE 'FN%' OR b.stat LIKE 'W%')
        );

Et si les sous-requêtes dans la clause HAVING sont interdites, peut-être que cela fonctionnera à la place:

SELECT  id
FROM    (
                SELECT  id, COUNT(*) stat_count
                FROM    foo
                WHERE   (stat LIKE 'FN%' OR stat LIKE 'W%')
                GROUP   BY id
        ) a
WHERE   stat_count = (SELECT COUNT(*) FROM foo b WHERE a.id = b.id);

Mise à jour: Je viens d'essayer ces requêtes sur Oracle, et les deux fonctionnent.

0voto

CheeseConQueso Points 2456

Où xxxx est la table temporaire qui contient ces informations à traiter.....

select id, fullname, count(id) ttl 
from xxxx 
group by id, fullname 
into temp www with no log;

select id, fullname, count(id) ttl_f 
from xxxx 
where grd like 'FN%' or grd like 'W%' 
group by id, fullname 
into temp wwww with no log;

select www.id, www.fullname 
from www, wwww 
where www.id = wwww.id and www.ttl = wwww.ttl_f;

0voto

MarkusQ Points 15612

Cette explication me donne mal à la tête. Cherchez-vous l'union de ces deux ensembles?

  • ids qui ont uniquement des stats correspondant à "W%"
  • ids qui ont uniquement des stats correspondant à "FN%"

Si c'est le cas, faites-en une requête UNION avec une sous-requête pour chacun des ensembles.

0voto

Matt Hensley Points 19

Ceci a été écrit par rapport à la question originale :

select first 50
c.id,
(select trim(fullname) from entity where id = c.id) fullname,
count(*),
(select count(*) from courses where id = c.id and grd like 'FN%') FN,
(select count(*) from courses where id = c.id and grd like 'W%') W
from courses c
group by 1

La sous-requête pour récupérer le nom est beaucoup plus rapide que d'utiliser une jointure pour une raison quelconque.

Édition : Ce qui suit aura le même comportement que la réponse de yukondude mais fonctionne mieux sur notre boîte HPUX / Informix v10.00.HC5.

select c.id
from courses c
where not exists (
        select id
        from courses
        where (grd not like 'W%' and grd not like 'FN%')
        and id = c.id
)
group by 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X