سؤال

أحاول إنشاء استعلام 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

هل كانت مفيدة؟

المحلول

فيما يلي حلان محتملان يمكنني التفكير فيهما.لست متأكدًا مما إذا كانوا سيعملون في 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، وكلاهما يعمل.

نصائح أخرى

هذا التفسير يجعل رأسي يؤلمني.هل تبحث عن اتحاد هاتين المجموعتين؟

  • المعرفات التي تحتوي فقط على إحصائيات تطابق "W%"
  • المعرفات التي تحتوي فقط على إحصائيات تطابق "FN%"

إذا كان الأمر كذلك، فاجعله استعلامًا موحدًا مع استعلام فرعي لكل مجموعة.

حيث 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