كيف يمكنني إرجاع السجلات التي تم تجميعها حسب باطل ولا باطل?

StackOverflow https://stackoverflow.com/questions/239545

  •  04-07-2019
  •  | 
  •  

سؤال

لدي جدول يحتوي على processed_timestamp العمود-إذا سجل تم تجهيزها ثم أن الحقل يحتوي على التاريخ والوقت كان معالجتها وإلا فهو باطل.

أريد أن أكتب الاستعلام بإرجاع صفين:

NULL        xx -- count of records with null timestamps
NOT NULL    yy -- count of records with non-null timestamps

هل هذا ممكن ؟

تحديث: الجدول هو كبير جدا ، لذلك الكفاءة هو المهم.أنا فقط يمكن تشغيل الاستعلامات لحساب مجموع كل على حدة ، ولكن أريد أن تجنب ضرب الطاولة مرتين اذا كان يمكنني تجنب ذلك.

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

المحلول

أوراكل:

مجموعة من nvl2(حقل, 'NOT NULL', 'NULL')

نصائح أخرى

في الخلية يمكن أن تفعل شيئا مثل

SELECT 
    IF(ISNULL(processed_timestamp), 'NULL', 'NOT NULL') as myfield, 
    COUNT(*) 
FROM mytable 
GROUP BY myfield

في T-SQL (MS SQL Server) ، وهذا يعمل:

SELECT
  CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END FieldContent,
  COUNT(*) FieldCount
FROM
  TheTable
GROUP BY
  CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END

جرب ما يلي إنه بائع محايدة:

select
    'null    ' as type,
    count(*)   as quant
    from       tbl
    where      tmstmp is null
union all
select
    'not null' as type,
    count(*)   as quant
    from       tbl
    where      tmstmp is not null

بعد أن المحلية DB2 المعلم انظر إلى هذا, لقد وتتفق:أيا من الحلول التي قدمتها حتى الآن (بما في ذلك هذا واحد) يمكن تجنب الجدول الكامل المسح الضوئي (الجدول إذا كان الطابع الزمني غير مفهرسة ، أو من indexotherwise).كلهم مسح كل سجل في الجدول مرة بالضبط.

على كل حال/إذا/NVL2() الحلول فارغة إلى سلسلة التحويل لكل صف إدخال لزوم الحمل على DBMS.هذا الحل لا يكون لديك هذه المشكلة.

إذا كان oracle ثم يمكنك القيام به:

select decode(field,NULL,'NULL','NOT NULL'), count(*)
from table
group by decode(field,NULL,'NULL','NOT NULL');

أنا متأكد من أن البعض DBs تسمح مماثلة.

ستيوارت ،

ربما تفكر في هذا الحل.هو (أيضا!) بائع غير محددة.

SELECT count([processed_timestamp]) AS notnullrows, 
       count(*) - count([processed_timestamp]) AS nullrows 
FROM table

كما الكفاءة يتجنب هذا 2x مؤشر ويسعى/عمليات التفحص الجدول/أيا كان بما في ذلك النتائج على صف واحد.إذا كنت على الاطلاق تتطلب 2 الصفوف في النتيجة ، مرورين على مجموعة قد يكون لا مفر منه بسبب unioning المجاميع.

ويساعد هذا الأمل

آخر الخلية طريقة استخدام CASE المشغل, التي يمكن تعميمها على أكثر من البدائل IF():

SELECT CASE WHEN processed_timestamp IS NULL THEN 'NULL' 
            ELSE 'NOT NULL' END AS a,
       COUNT(*) AS n 
       FROM logs 
       GROUP BY a

إذا كان لديك قاعدة بيانات فعالة COUNT(*) الدالة على الطاولة ، يمكن التعويل أيهما أصغر عدد وطرح.

SQL Server (بدءا من عام 2012):

SELECT IIF(ISDATE(processed_timestamp) = 0, 'NULL', 'NON NULL'), COUNT(*)
FROM MyTable
GROUP BY ISDATE(processed_timestamp);

أنا شخصيا أحب باكس هو الحل, ولكن إذا كنت على الاطلاق لا تتطلب سوى صف واحد عاد (كما كان مؤخرا) ، في MS SQL Server 2005/2008 يمكنك "كومة" اثنين من الاستفسارات باستخدام CTE

with NullRows (countOf)
AS
(
    SELECT count(*) 
    FORM table 
    WHERE [processed_timestamp] IS NOT NULL
)
SELECT count(*) AS nulls, countOf
FROM table, NullRows
WHERE [processed_timestamp] IS NULL
GROUP BY countOf

ويساعد هذا الأمل

[T-SQL]:

select [case], count(*) tally
from (
  select 
  case when [processed_timestamp] is null then 'null'
  else 'not null'
  end [case]
  from myTable
) a 

و يمكنك إضافة إلى بيان حالة ما قيم أخرى كنت ترغب في شكل التقسيم ، على سبيل المثالاليوم, أمس, بين الظهر و 2 بعد الساعة 6 مساء يوم الخميس.

Select Sum(Case When processed_timestamp IS NULL
                         Then 1
                         Else 0
                 End)                                                               not_processed_count,
          Sum(Case When processed_timestamp Is Not NULL
                         Then 1
                         Else 0
                 End)                                                               processed_count,
          Count(1)                                                                total
From table

تحرير:لم تقرأ بعناية هذه إرجاع صف واحد.

في أوراكل

SELECT COUNT(*), COUNT(TIME_STAMP_COLUMN)
FROM TABLE;

count(*) ترجع عدد من كافة الصفوف

عدد(column_name) إرجاع عدد الصفوف التي ليست فارغة ، لذلك

SELECT COUNT(*) - COUNT(TIME_STAMP_COLUMN) NUL_COUNT,
                  COUNT(TIME_STAMP_COLUMN) NON_NUL_COUNT
FROM TABLE

يجب القيام بهذه المهمة.

إذا كان العمود فهرسة, قد ينتهي بك الأمر مع بعض نوع من مجموعة مسح وتجنب فعلا قراءة الجدول.

طريقة أخرى في T-sql (sql server)

select  count(case when t.timestamps is null 
                    then 1 
                    else null end) NULLROWS,
        count(case when t.timestamps is not null 
                    then 1 
                    else null end) NOTNULLROWS
from myTable t 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top