Frage

Ich versuche, eine SQL-Abfrage zu erstellen, die sowohl die Gesamtanzahl der Zeilen für jede ID, und die Zahl der ‚FN%‘ von id gruppiert und ‚W%‘ Qualitäten zählen. Wenn diese Zahlen gleich sind, dann wird nur der Student entweder alle ‚FN%‘ oder alle ‚W%‘ oder eine Kombination aus beidem.

Ich brauche eine Liste aller IDs, die nur Statistiken von 'FN%' oder 'W%' haben

Beispiel-ID # 683 & 657 würde es in die Ergebnismenge der Abfrage, 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:

683
657

War es hilfreich?

Lösung

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

Andere Tipps

Diese Erklärung macht meinen Kopf weh. Suchen Sie die Vereinigung dieser beiden Sätze suchen?

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

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

Wo xxxx wird die temporäre Tabelle, die diese Informationen verarbeitet werden, hält .....

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;

Dieses 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 die Namen abzurufen ist viel schneller als mit einem aus irgendeinem Grunde kommen.

Edit: Im Folgendes wird das gleiche Verhalten wie yukondude Antwort hat, aber ein bessere Leistung auf unserer HP-UX / 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top