2009-03-27 4 views
1

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

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

пример 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 

пример вывода:

ответ

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 являются 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, и оба работают.

+0

Оба вопроса отлично работают в Informix IDS 11.50.FC3W2 на Solaris 10. –

+0

да, это работает с моим тоже informix – CheeseConQueso

0

Где ххое это таблица температуры, которая держит эту информацию для обработки .....

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; 
+0

Это долгий путь для этого. Откуда появляется полное имя? –

0

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

  • идентификаторов, которые имеют только статистику соответствие «W%»
  • идентификаторов, которые имеют только статистику, соответствующую «FN%»

Если это так, то сделать это UNION запросом с подзапросом для каждого из множеств.

+0

Мне даже не нравилось мое собственное объяснение ... Мне просто нужно было найти всех идентификаторов, у которых была статистика только («FN%» или «W%») – CheeseConQueso

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 
+0

где вы получаете полное имя и курсы? – CheeseConQueso

+0

Это создает больше строк, чем требуется, и содержит данные, которые не были необходимы, и ссылается на неопределенную таблицу ... –

+0

Кажется, вы используете Jenzabar CX, но я мог ошибаться. Если вы, замените «entity» на id_rec и «курсы» cw_rec. –