ماهو - شرح sql




COUNT مميزة مع شروط (3)

جرب العبارة التالية:

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

سيكون الحقل الأول هو العلامة ، وسوف يكون الثاني هو العدد الكلي ، والثالث سيكون العدد الإيجابي منها.

أريد حساب عدد العناصر المتميزة في عمود خاضع لشرط معين ، على سبيل المثال إذا كان الجدول كما يلي:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

إذا أردت حساب عدد العلامات المميزة كـ "عدد العلامات" وحساب عدد العلامات المميزة التي بها معرف إدخال> 0 "كعدد علامات موجب" في نفس الجدول ، فماذا أفعل؟

أعتمد الآن من جدولين مختلفين ، حيث قمت في الجدول الثاني باختيار هذه الصفوف فقط باستخدام الإدخالID أكبر من الصفر. أعتقد أنه يجب أن تكون هناك طريقة أكثر إحكاما لحل هذه المشكلة.


قد يعمل هذا أيضًا:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

أنت بحاجة إلى شرط entryID في الارتباط الأيسر بدلاً من جملة حيث للتأكد من أن أي عناصر تحتوي على إدخال فقط من 0 يتم احتسابها بشكل صحيح في DISTINCT الأول.


يمكنك تجربة هذا:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

count(distinct...) الأول count(distinct...) سهل. الثانية ، تبدو معقدة بعض الشيء ، هي في الواقع نفس واحدة ، باستثناء أن تستخدم case...when الشرط. في case...when الجملة ، تقوم بتصفية القيم الموجبة فقط. الأصفار أو القيم السالبة ستكون null ولا يتم تضمينها في العدد.

شيء واحد أن نلاحظ هنا هو أن هذا يمكن القيام به عن طريق قراءة الجدول مرة واحدة. عندما يبدو أنه عليك قراءة نفس الجدول مرتين أو أكثر ، يمكن فعل ذلك من خلال القراءة مرة واحدة ، في معظم الوقت. وكنتيجة لذلك ، فإنه سيتم إنهاء المهمة بشكل أسرع بكثير مع أقل I / O.







sql