2009-03-27 11 views
1

Ich versuche, eine SQL-Abfrage zu erstellen, die sowohl die Gesamtzahl der Zeilen für jede ID zählt, als auch die Anzahl der 'FN%' und 'W%' Klassen nach ID gruppiert. Wenn diese Zahlen gleich sind, dann hat der Schüler nur entweder 'FN%' oder alle 'W%' oder eine Kombination von beiden.Informix SQL count() Vergleiche

Ich brauche eine Liste aller IDs, die nur Statistiken von ‚FN%‘ oder ‚W%‘

Beispiel id # 683 & 657 in die Ergebnismenge der Abfrage machen würde, aber 603, 781 & 694 würde nicht

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 

Beispielausgabe:

Antwort

3

Hier sind zwei mögliche Lösungen, die ich mir vorstellen kann. Ich bin mir nicht sicher, ob sie in Informix arbeiten werden:

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%') 
     ); 

Und wenn Subqueries in der HAVING Klausel verboten sind, vielleicht wird diese Arbeit statt:

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); 

Update: Ich habe gerade versucht, diese in Oracle, und beide arbeiten.

+0

Beide Abfragen funktionieren gut in Informix IDS 11.50.FC3W2 auf Solaris 10. –

+0

ja das funktioniert mit meinem auch informix – CheeseConQueso

0

Wo xxxx die temporäre Tabelle, die diese Informationen verarbeitet ..... macht verletzt meinen Kopf

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

Das ist ein langer Weg, es zu tun. Woher kommt der vollständige Name? –

0

Diese Erklärung werden hält. Suchst du nach der Vereinigung dieser beiden Sets?

  • IDs, die nur Statistiken für: "W%" haben
  • IDs, die nur Statistiken für: "FN%" haben

Wenn das der Fall ist, macht es zu einer UNION-Abfrage mit einer Unterabfrage für jeden der Sätze.

+0

Ich mag auch nicht einmal meine eigene Erklärung ... ich musste nur alle IDs finden, die nur Statistiken hatten ('FN%' oder 'W%') – CheeseConQueso

0

Dies wurde gegen die ursprüngliche Frage geschrieben:

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 

Die Unterabfrage zum Abrufen der Name viel schneller ist als die Verwendung von einem aus irgendeinem Grund kommen.

Edit: Das Folgende wird das gleiche Verhalten wie yukondes Antwort haben, führt aber besser auf unserer HPUX/Informix v10.00.HC5-Box.

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

Woher bekommst du Fullname und Kurse? – CheeseConQueso

+0

Dies erzeugt mehr Zeilen als erforderlich und enthält Daten, die nicht benötigt wurden, und verweist auf eine undefinierte Tabelle ... –

+0

Es scheint, dass Sie Jenzabar CX ausführen - aber ich könnte falsch liegen. Wenn dies der Fall ist, ersetzen Sie "entity" durch id_rec und "courses" durch cw_rec. –