Informix SQL count () Vergleiche
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
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