我正在尝试构建一个SQL查询,它将计算每个id的总行数,以及按ID分组的“FN%”和“W%”等级的数量。如果这些数字相等,则学生只有全部'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
答案 0 :(得分:3)
以下是我能想到的两种可能的解决方案。我不确定他们是否会在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
子句中的子查询是禁止的,那么这可能会起作用:
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中尝试了这些,并且都可以工作。
答案 1 :(得分:0)
其中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;
答案 2 :(得分:0)
这个解释让我头疼。你在寻找这两套联合体吗?
如果是这种情况,请将其作为UNION查询,并为每个集合提供子查询。
答案 3 :(得分:0)
这是针对原始问题写的:
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