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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top