مقارنات Informix SQL count()
سؤال
أحاول إنشاء استعلام 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