Question

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 grades « % FN » et « W% » regroupés par id. Si ces chiffres sont égaux, l'étudiant n'a que ce soit tous les « FN% » ou tout « W% » ou une combinaison des deux.

J'ai besoin d'une liste de tous les id qui ont seulement les statistiques de 'FN%' ou 'W%'

exemple id # 683 & 657 se faire dans le jeu de résultats de la requête, mais 603, 781 et 694 ne serait 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

Était-ce utile?

La solution

Voici deux solutions possibles que je peux penser. Je ne sais pas s'ils vont travailler 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 verboten, peut-être 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 Oracle, et les deux travaux

Autres conseils

Cette explication me fait mal à la tête. Vous cherchez l'union de ces deux ensembles?

  • ids qui n'ont les statistiques correspondant à "W%"
  • ids qui n'ont les statistiques correspondant à "FN%"

Si tel est le cas, faire une requête UNION avec une sous-requête pour chacun des ensembles.

Où xxxx est la table temporaire qui détient cette information à 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;

Ceci a été écrit contre la question initiale:

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.

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

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top