Informix SQL count() confronti
Domanda
Sto cercando di costruire una query SQL che conte sia il numero totale di righe per ogni id e il numero di 'FN%' e 'W%' gradi raggruppati per id.Se quei numeri sono uguali, allora studente solo ha tutti 'FN%' o all 'W%' o una combinazione di entrambi.
Ho bisogno di un elenco di tutti gli id che hanno solo le statistiche di 'FN%' o 'W%'
esempio id # 683 & 657 sarebbe nel set di risultati della query, ma 603, 781 & 694 non
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
esempio di output:
683
657
Soluzione
Qui ci sono due possibili soluzioni che mi vengono in mente.Non so se funzionerà in 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%')
);
E se la subquery nella HAVING
clausola sono verboten, forse questo sarà un posto di lavoro:
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);
Aggiornamento:Ho appena provato queste in Oracle, e sia il lavoro.
Altri suggerimenti
Che spiegazione mi fa male la testa.Stai cercando unione di questi due insiemi?
- id, che hanno solo le statistiche di corrispondenza "W%"
- id, che hanno solo le statistiche di corrispondenza "FN%"
Se questo è il caso, fare una query di UNIONE con un sub-query per ogni set.
Dove xxxx è la temp tabella che contiene questa informazione deve essere elaborato.....
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;
Questo è stato scritto contro la domanda iniziale:
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 subquery per recuperare il nome è molto più veloce rispetto all'utilizzo di un join per qualche motivo.
Edit:I seguenti avranno lo stesso comportamento come yukondude la risposta, ma si comporta meglio sul nostro 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