كيف يمكنني إرجاع السجلات التي تم تجميعها حسب باطل ولا باطل?
سؤال
لدي جدول يحتوي على 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