2009-03-27 8 views
1

J'essaie de créer une requête SQL qui comptera à la fois le nombre total de lignes pour chaque identifiant et le nombre de notes 'FN%' et 'W%' regroupées par id. Si ces nombres sont égaux, alors l'étudiant a seulement tous les 'FN%' ou tous les 'W%' ou une combinaison des deux.Comparaisons de comptes SQL() d'Informix

je besoin d'une liste de tous les id qui ont seulement les statistiques de « FN% » ou « W% »

exemple id # 683 & 657 ferait dans le jeu de résultats de la requête, mais 603, 781 & 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 
sortie

exemple:

Répondre

3

Voici deux solutions possibles auxquelles 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 va fonctionner à 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 derniers dans Oracle, et les deux fonctionnent.

+0

Les deux requêtes fonctionnent très bien dans Informix IDS 11.50.FC3W2 sur Solaris 10. –

+0

ouais cela fonctionne avec mon Informix aussi – CheeseConQueso

0

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; 
+0

C'est un long chemin à faire. D'où vient le nom complet? –

0

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

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

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

+0

Je n'aime même pas ma propre explication non plus ... je devais juste trouver tous les ID qui avaient des statistiques de seulement ('FN%' ou 'W%') – CheeseConQueso

0

Cela 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 

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

Editer: 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 
+0

d'où obtenez-vous le nom complet et les cours? – CheeseConQueso

+0

Cela produit plus de lignes que nécessaire, et inclut des données qui n'étaient pas nécessaires, et fait référence à un tableau indéfini ... –

+0

Il semble que vous utilisez Jenzabar CX - mais je peux me tromper. Si c'est le cas, remplacez 'entity' par id_rec, et 'courses' par cw_rec. –

Questions connexes