Informix SQL count () сравнения - PullRequest
1 голос
/ 27 марта 2009

Я пытаюсь создать запрос SQL, который будет подсчитывать как общее количество строк для каждого идентификатора, так и количество оценок «FN%» и «W%», сгруппированных по идентификатору. Если эти числа равны, то у ученика есть только все «FN%» или все «W%» или их комбинация.

Мне нужен список всех идентификаторов, которые имеют статистику «FN%» или «W%»

пример с идентификатором # 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

Ответы [ 4 ]

3 голосов
/ 27 марта 2009

Вот два возможных решения, которые я могу придумать. Я не уверен, что они будут работать в 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, и оба работают.

0 голосов
/ 27 марта 2009

Это объяснение заставляет мою голову болеть. Вы ищете объединение этих двух наборов?

  • идентификаторы, характеристики которых соответствуют только "W%"
  • идентификаторы, у которых только статистика соответствует "FN%"

В этом случае сделайте запрос UNION с подзапросом для каждого из наборов.

0 голосов
/ 27 марта 2009

Это было написано против исходного вопроса:

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

По какой-то причине подзапрос для получения имени выполняется намного быстрее, чем при использовании объединения.

Edit: Следующие действия будут такими же, как и у ответа 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
0 голосов
/ 27 марта 2009

Где 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;
...