Informix SQL COUNT () 비교
문제
각 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
제휴하지 않습니다 StackOverflow