문제

각 ID에 대한 총 행 수와 ID로 그룹화 된 'FN%'및 'W%'등급의 수를 모두 계산하는 SQL 쿼리를 구축하려고합니다. 그 숫자가 같으면, 학생은 모든 'fn%'또는 모든 'w%'또는이 둘의 조합 만 가지고 있습니다.

'fn%'또는 'w%'의 통계 만있는 모든 ID 목록이 필요합니다.

예제 ID # 683 & 657은 쿼리의 결과 세트로 만들어 지지만 603, 781 & 694

   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

샘플 출력 :

683
657

도움이 되었습니까?

해결책

다음은 내가 생각할 수있는 두 가지 가능한 솔루션입니다. 그들이 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%')
        );

그리고 그 하위 쿼리가 있다면 HAVING 조항은 verboten입니다. 아마도 이것은 대신 작동 할 것입니다.

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

업데이트 : 방금 Oracle에서 시도해 보았습니다.

다른 팁

그 설명은 내 머리를 아프게합니다. 이 두 세트의 결합을 찾고 있습니까?

  • "W%"와 일치하는 통계 만있는 ID
  • "fn%"일치하는 통계 만있는 ID

이 경우 각 세트에 대한 하위 쿼리가있는 Union 쿼리로 만드십시오.

여기서 xxxx는이 정보를 처리 할 임시 테이블입니다 .....

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;

이것은 원래 질문에 대해 작성되었습니다.

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

이름을 검색하는 하위 퀘스트는 어떤 이유로 묶음을 사용하는 것보다 훨씬 빠릅니다.

편집 : 다음은 Yukondude의 답변과 동일한 동작을 가지지 만 HPUX / Informix v10.00.hc5 상자에서 더 잘 수행됩니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top