Informix comparaisons de comptage SQL ()
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
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