2008-10-27 6 views
39

मेरे पास एक टेबल है जिसमें processed_timestamp कॉलम है - यदि एक रिकॉर्ड संसाधित किया गया है तो उस फ़ील्ड में डेटाटाइम होता है जिसे संसाधित किया गया था, अन्यथा यह शून्य है।मैं अपने रिकॉर्ड को न्यूल द्वारा समूहीकृत कैसे करूं और न्यूल न करें?

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

कि संभव है:

मैं एक प्रश्न है कि दो पंक्तियों रिटर्न लिखना चाहते हैं?

अद्यतन: तालिका काफी बड़ी है, इसलिए क्षमता महत्वपूर्ण है। मैं अलग-अलग प्रत्येक गणना की गणना करने के लिए केवल दो प्रश्नों को चला सकता हूं, लेकिन यदि मैं इससे बच सकता हूं तो मैं तालिका को दो बार मारने से बचना चाहता हूं।

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

मुझे यकीन है कि अन्य डीबीएस समान चाल के लिए अनुमति हूँ:

उत्तर

18

ओरेकल:

द्वारा समूह nvl2 (क्षेत्र, 'नहीं NULL', 'शून्य')

+0

मीठे - यह एक निफ्टी कस्टम फ़ंक्शन है। (यहां और अधिक: http://www.java2s.com/Code/Oracle/Char-Functions/NVL2xvalue1value2Returnsvalue1ifxisnotnullifxisnullvalue2isreturned।एचटीएम) –

42

MySQL में आप अगर यह ओरेकल तो आप क्या कर सकते हैं की तरह

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

यह अद्भुत है, मैं अगर सशर्त कुछ के साथ चारों ओर खेलने के लिए की जरूरत है अधिक –

+0

MySQL के लिए सबसे अच्छा जवाब। – marijnz0r

20

निम्नलिखित का प्रयास करें, यह विक्रेता के तटस्थ है:

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 

इस पर हमारे स्थानीय डीबी 2 गुरु नज़र होने के बाद, वह इस बात से सहमत: (इसे मिलाकर) तारीख को प्रस्तुत समाधान में से कोई भी एक पूर्ण तालिका से बच सकते हैं स्कैन करें (तालिका का टाइमस्टैम्प अनुक्रमित नहीं है, या सूचकांक के अनुसार)। वे सभी एक बार तालिका में हर रिकॉर्ड स्कैन करते हैं।

सभी केस/आईएफ/एनवीएल 2() समाधान प्रत्येक पंक्ति के लिए एक नल-टू-स्ट्रिंग रूपांतरण करते हैं, जो डीबीएमएस पर अनावश्यक भार प्रस्तुत करते हैं। इस समाधान में वह समस्या नहीं है।

+0

यह एक बहुत बड़ी मेज है - इसे दो बार मारना इस तरह अक्षम है, नहीं? –

+0

नहीं, वास्तव में (कम से कम डीबी 2 जो डीबी मैं उपयोग करता हूं), यह समाधान सभी डीकोड/nvl2-type वाले जितना तेज़ होगा - उन्हें सभी को एक पूर्ण टेबल स्कैन करना होगा (मेरा समाधान उसी नंबर को संसाधित करेगा कुल मिलाकर रिकॉर्ड लेकिन दो समूहों में) - दोनों मामलों में टाइमस्टैम्प क्षेत्र पर सूचकांक reqd। – paxdiablo

+0

जब मैं कल काम करने के लिए एक विक्रेता-विशिष्ट के साथ इस समाधान को साइड-बाय-साइड करना दिलचस्प लगेगा। –

31

T-SQL (एमएस एसक्यूएल सर्वर) में, यह काम करता है:

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 
0

एक और MySQL विधि CASE operator, जो IF() की तुलना में अधिक विकल्पों की सामान्यीकृत किया जा सकता का उपयोग करना है:

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

आईएफ() फ़ंक्शन भी काम करता है - अगर (processed_timestamp शून्य है, 'शून्य', 'शून्य नहीं') – pilsetnieks

0

मैं व्यक्तिगत रूप से पैक्स के समाधान की तरह है, लेकिन आप पूरी तरह से की आवश्यकता होती है, तो केवल एक पंक्ति लौटे (जैसा कि मैंने हाल ही में किया था), एमएस एसक्यूएल सर्वर 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 

आशा इस का उपयोग करते हुए मदद करता है

+0

लेकिन फिर आप डेटाबेस को दो बार अक्षम कर रहे हैं - अक्षम। (यही कारण है कि पैक्स ने अपना समाधान हटा दिया।) –

+0

इतनी सरल समस्या के लिए बहुत बड़ी स्वीकृति, है ना? – Tomalak

+0

यदि आपका डेटाबेस इसे अनुकूलित नहीं करता है तो आप केवल दो बार डेटाबेस को मार रहे हैं। शायद एक सुरक्षित धारणा, लेकिन फिर भी एक धारणा। – Tanktalus

0

[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 बजे के बाद।

5

स्टीवर्ट,

शायद इस समाधान पर विचार करें। यह (भी!) विक्रेता गैर विशिष्ट है।

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

दक्षता का सवाल है, इस 2x सूचकांक चाहता है से बचा जाता है/तालिका स्कैन/जो कुछ भी एक पंक्ति पर परिणामों को शामिल करके। यदि आपको परिणाम में 2 पंक्तियों की पूरी आवश्यकता होती है, तो सेट पर दो पास योग जोड़ों के कारण अपरिहार्य हो सकते हैं।

आशा इस मदद करता है

0
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 

संपादित करें: ध्यान से पढ़ें नहीं था, यह एक एक ही पंक्ति लौटाता है।

0

Oracle

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

गिनती (*) में सभी पंक्तियों

गणना (स्तंभ) की गणना देता पंक्तियों जो शून्य नहीं हैं की संख्या देता है, तो

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

चाहिए नौकरी करने के लिए

यदि कॉलम अनुक्रमित है, तो आप किसी प्रकार के रेंज स्कैन के साथ समाप्त हो सकते हैं और वास्तव में तालिका को पढ़ने से बच सकते हैं।

1

यदि आपके डेटाबेस में एक तालिका के लिए एक कुशल COUNT (*) फ़ंक्शन है, तो आप COUNT जो भी छोटी संख्या हो सकते हैं, और घटा सकते हैं।

1

एसक्यूएल सर्वर (2012 के साथ शुरू):

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

T-SQL में एक और तरीका है (एसक्यूएल सर्वर)

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 
संबंधित मुद्दे