एक ही प्रश्न में शून्य और गैर-शून्य मानों की गिनती


141

मेरे पास एक टेबल है

create table us
(
 a number
);

अब मेरे पास डेटा है:

a
1
2
3
4
null
null
null
8
9

अब मुझे n की गणना करने के लिए एक एकल क्वेरी की आवश्यकता है और कॉलम a में शून्य मानों को नहीं


3
नमस्ते, आपको इस तरह के काउंटिंग डेटाबेस कोड की क्या आवश्यकता है, हम किस भाषा डेटाबेस में सर्वश्रेष्ठ सादर, Iordan
IordanTanev

2
मुझे आश्चर्य है कि किसी भी एक उत्तर में चुनिंदा गिनती (*) का एक सरल संघ नहीं है ...
लेवेन कीर्सेमेकर

1
@ लाइवेन: पृथ्वी पर आप unionयहां क्यों प्रयोग करेंगे ? मोंटेक्रिस्टो का जवाब अब तक का सबसे अच्छा समाधान है।
एरिक

1
क्योंकि ओपी इसे एक ही क्वेरी के साथ चाहता है। मोंटेक्रिस्टो का जवाब वास्तव में अब तक का सबसे अच्छा समाधान है ... उसे बस संघ को जोड़ने की जरूरत है :)
लेवेन केर्समेकर्स

1
और यही मुझे शीर्षक पढ़ने के लिए मिलता है। संपादित करेंगे।
एरिक

जवाबों:


231

यह Oracle और SQL सर्वर के लिए काम करता है (आप इसे दूसरे RDBMS पर काम करने में सक्षम कर सकते हैं):

select sum(case when a is null then 1 else 0 end) count_nulls
     , count(a) count_not_nulls 
  from us;

या:

select count(*) - count(a), count(a) from us;

1
के बीच के अंतर का उपयोग करना count(*)और count(a)साथ ही साथ काम करता हैgroup by
शैनन

1
@ मैंशन सहमत हूं, COUNT(a)जोड़ने के लिए एक उपयोगी टिप्पणी है, लेकिन यह आपके स्टैक के आधार पर चेतावनी / त्रुटि को फेंक देता है और कोड में टिप्पणी को वारंट कर सकता है। मैं SUMविधि पसंद करूंगा ।
रिचर्ड

4
पसंद count(*)करेंcount(1)
लेई झाओ

61

अगर मैं सही ढंग से समझ गया कि आप सभी NULL और सभी NOT NULL को एक कॉलम में गिनना चाहते हैं ...

यदि यह सही है:

SELECT count(*) FROM us WHERE a IS NULL 
UNION ALL
SELECT count(*) FROM us WHERE a IS NOT NULL

टिप्पणियों को पढ़ने के बाद पूरी क्वेरी के लिए संपादित:]


SELECT COUNT(*), 'null_tally' AS narrative 
  FROM us 
 WHERE a IS NULL 
UNION
SELECT COUNT(*), 'not_null_tally' AS narrative 
  FROM us 
 WHERE a IS NOT NULL;

7
+1: अब तक का सबसे सरल, तेज तरीका। जब हर जवाब यह नहीं था तो मैं चौंक गया था।
एरिक

6
हां लेकिन नहीं। मुझे लगता है कि वह केवल एक क्वेरी में NULL और नहीं NULL की संख्या चाहता है ... आप कह रहे हैं कि दो प्रश्नों में कैसे करें ...
Romain Linsolas

@romaintaz: काफी सही है। मैंने शीर्षक को प्रश्न के रूप में पढ़ा। पांच संपादनों में, किसी ने इसे ठीक करने के लिए नहीं सोचा था। Yeesh।
एरिक

@romaintaz: हाँ, आप सही हैं, मैंने इसे "एक बार क्वेरी को स्पॉट करने के लिए चलाएं कि हमारे पास कितने नल हैं", मुझे पता भी नहीं है कि ^ ^ क्यों, सही करने के लिए जा रहा है, धन्यवाद।
अल्बर्टो Zaccagni

1
@ मोंटेक्रिस्टो: क्योंकि शीर्षक ने केवल गिनती के लिए कहा है null:)
एरिक

42

यहाँ एक त्वरित और गंदा संस्करण है जो Oracle पर काम करता है:

select sum(case a when null then 1 else 0) "Null values",
       sum(case a when null then 0 else 1) "Non-null values"
from us

3
इसी तरह का सिंटैक्स SQL ​​सर्वर में भी काम करेगा। इसके अलावा, इस तरह से करने से केवल एक बार टेबल स्कैन होगा; UNION समाधान दो टेबल स्कैन करेगा। छोटी तालिकाओं के लिए अप्रासंगिक, विशाल लोगों के लिए बहुत महत्वपूर्ण है।
फिलिप केली

2
SQL सर्वर के लिए केवल परिवर्तन "Null values"बनना होगा 'Null values'। एकल उद्धरण, युगल नहीं।
एरिक

1
SQLServer इस क्वेरी के लिए एक इंडेक्स स्कैन का उपयोग करता है। दो इंडेक्स में यूनियन का उपयोग करता है। 40.000 पंक्तियों वाली तालिका में, कोई गति अंतर नहीं है।
लेवेन कीर्सेमेकर्स

1
11.332.581 पंक्तियों के साथ एक मेज पर, दो टेबल स्कैन होते हैं , कोई ध्यान देने योग्य गति अंतर नहीं होता है (वास्तविक, संघ थोड़ा सा है )।
लेवेन कीर्सेमेकर्स

1
यह मेरे लिए Oracle 11g में काम नहीं किया। संस्करण @ user155789 "केस के साथ पोस्ट किया गया जब एक शून्य है तो 1 और 0 अंत" वाक्यविन्यास था जो काम करता था।
स्टीव

25

जैसा कि मैंने आपकी क्वेरी को समझ लिया है, आप बस इस स्क्रिप्ट को चलाते हैं और टोटल नल, टोटल नॉटनल रो, प्राप्त करते हैं।

select count(*) - count(a) as 'Null', count(a) as 'Not Null' from us;

23

गैर नलियों के लिए

select count(a)
from us

नलियों के लिए

select count(*)
from us

minus 

select count(a)
from us

अत

SELECT COUNT(A) NOT_NULLS
FROM US

UNION

SELECT COUNT(*) - COUNT(A) NULLS
FROM US

काम करना चाहिए

इसमें बेहतर है कि कॉलम के शीर्षक सही आएं।

SELECT COUNT(A) NOT_NULL, COUNT(*) - COUNT(A) NULLS
FROM US

मेरे सिस्टम पर कुछ परीक्षण में, यह एक पूर्ण टेबल स्कैन की लागत है।


4
अच्छा ग्रेवी, यार, इन सवालों के निष्पादन की योजनाओं को देखो। आप बाएँ और दाएँ टेबल स्कैन को लात मार रहे हैं, विशेष रूप से जहां इस तरह के एक खूनी सरल कथन ( select count(*) from t where a is null) है जो ऐसा करता है।
एरिक

2
मेरे पास देखने के लिए एक डेटाबेस काम नहीं है, लेकिन या तो स्तंभ अनुक्रमित है या नहीं। यदि ऐसा है, तो यह एक सीमा स्कैन के माध्यम से होता है, अन्यथा, आप एक पूर्ण तालिका स्कैन के साथ बहुत अधिक शेष हैं। Oracle में, NULLs को इंडेक्स में संग्रहीत नहीं किया जाता है, इसलिए मुझे संदेह है कि आप उदाहरण बहुत बेहतर नहीं हैं। आपका दमन बहुत हो सकता है।
EvilTeach

1
@ ईविलचैट: इंडेक्स केवल तब ही मददगार होते हैं जब आप पीछे नहीं जा रहे हों ~ पंक्तियों का 10%। उसके बाद, पूर्ण स्कैन शुरू किए जाते हैं। इस मामले में, आपको कम से कम एक बार स्कैन मिलेगा, यदि दो बार नहीं।
एरिक

19

आमतौर पर मैं इस ट्रिक का उपयोग करता हूं

select sum(case when a is null then 0 else 1 end) as count_notnull,
       sum(case when a is null then 1 else 0 end) as count_null
from tab
group by a


6

यह थोड़ा मुश्किल है। मान लें कि तालिका में केवल एक स्तंभ है, तो गणना (1) और गणना (*) अलग-अलग मान देगा।

set nocount on
    declare @table1 table (empid int)
    insert @table1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(NULL),(11),(12),(NULL),(13),(14);

    select * from @table1
    select COUNT(1) as "COUNT(1)" from @table1
    select COUNT(empid) "Count(empid)" from @table1

क्वेरी परिणाम

जैसा कि आप छवि में देख सकते हैं, पहला परिणाम दिखाता है कि तालिका में 16 पंक्तियाँ हैं। जिसमें से दो पंक्तियाँ NULL हैं। इसलिए जब हम गणना इंजन (*) का उपयोग करते हैं, तो क्वेरी इंजन पंक्तियों की संख्या को गिनता है, इसलिए हमें 16 के रूप में गणना परिणाम मिला। लेकिन गणना (एम्पिड) के मामले में यह कॉलम एम्पिड में गैर-पूर्ण-मानों की गणना करता है । इसलिए हमें 14 के रूप में परिणाम मिला।

इसलिए जब भी हम COUNT (कॉलम) का उपयोग कर रहे हैं, तो सुनिश्चित करें कि हम नीचे दिखाए गए अनुसार NULL मानों का ध्यान रखते हैं।

select COUNT(isnull(empid,1)) from @table1

NULL और Non-NULL दोनों मानों की गणना करेगा।

नोट : जब तालिका एक से अधिक कॉलम से बनी हो, तब भी समान बात लागू होती है। काउंट (1) NULL / Non-NULL मानों के बावजूद कुल पंक्तियों की संख्या देगा। केवल जब कॉलम मान को काउंट (कॉलम) का उपयोग करके गिना जाता है, तो हमें NULL मूल्यों का ध्यान रखना चाहिए।


4

मेरे पास एक समान मुद्दा था: सभी अलग-अलग मूल्यों को गिनने के लिए, शून्य मानों को 1 के रूप में गिनना। एक साधारण गणना इस मामले में काम नहीं करती है, क्योंकि यह शून्य मानों को ध्यान में नहीं रखती है।

यहां एक स्निपेट है जो SQL पर काम करता है और इसमें नए मानों का चयन शामिल नहीं है। मूल रूप से, एक बार विशिष्ट प्रदर्शन करने के बाद, पंक्ति_number () फ़ंक्शन का उपयोग करके एक नए कॉलम (n) में पंक्ति संख्या भी लौटाएं, फिर उस कॉलम पर एक गणना करें:

SELECT COUNT(n)
FROM (
    SELECT *, row_number() OVER (ORDER BY [MyColumn] ASC) n
    FROM (
        SELECT DISTINCT [MyColumn]
                    FROM [MyTable]
        ) items  
) distinctItems

3

यहाँ दो समाधान हैं:

Select count(columnname) as countofNotNulls, count(isnull(columnname,1))-count(columnname) AS Countofnulls from table name

या

Select count(columnname) as countofNotNulls, count(*)-count(columnname) AS Countofnulls from table name


3

इसे इस्तेमाल करे..

SELECT CASE 
         WHEN a IS NULL THEN 'Null' 
         ELSE 'Not Null' 
       END a, 
       Count(1) 
FROM   us 
GROUP  BY CASE 
            WHEN a IS NULL THEN 'Null' 
            ELSE 'Not Null' 
          END 

2

यदि आप MS Sql सर्वर का उपयोग कर रहे हैं ...

SELECT COUNT(0) AS 'Null_ColumnA_Records',
(
    SELECT COUNT(0)
    FROM your_table
    WHERE ColumnA IS NOT NULL
) AS 'NOT_Null_ColumnA_Records'
FROM your_table
WHERE ColumnA IS NULL;

मैं आपको ऐसा करने से मना नहीं करता ... लेकिन यहाँ आपके पास यह है (परिणाम के रूप में उसी तालिका में)


2

ISNULL एम्बेडेड फ़ंक्शन का उपयोग करें।



यह भी एक योग्य उत्तर है। मैंने व्यक्तिगत रूप से पाया कि COUNT (DISTINCT ISNULL (A, '')) तब भी बेहतर काम करता है, COUNT (DISTINCT A) + SUM (जब एक IS 1 नं 0 ELSE 0 END है)
वडालव

1

अगर इसके mysql, तुम कुछ इस तरह की कोशिश कर सकते हैं।

select 
   (select count(*) from TABLENAME WHERE a = 'null') as total_null, 
   (select count(*) from TABLENAME WHERE a != 'null') as total_not_null
FROM TABLENAME

1
SELECT SUM(NULLs) AS 'NULLS', SUM(NOTNULLs) AS 'NOTNULLs' FROM 
    (select count(*) AS 'NULLs', 0 as 'NOTNULLs' FROM us WHERE a is null
    UNION select 0 as 'NULLs', count(*) AS 'NOTNULLs' FROM us WHERE a is not null) AS x

यह भयंकर रूप से है, लेकिन यह 2 कॉल के साथ एक एकल रिकॉर्ड लौटाएगा, जो शून्य बनाम गैर नल की गिनती को दर्शाता है।


1

यह T-SQL में काम करता है। यदि आप किसी चीज़ की संख्या की गिनती कर रहे हैं और आप नल को शामिल करना चाहते हैं, तो केस के बजाय COALESCE का उपयोग करें।

IF OBJECT_ID('tempdb..#us') IS NOT NULL
    DROP TABLE #us

CREATE TABLE #us
    (
    a INT NULL
    );

INSERT INTO #us VALUES (1),(2),(3),(4),(NULL),(NULL),(NULL),(8),(9)

SELECT * FROM #us

SELECT CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END AS 'NULL?',
        COUNT(CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END) AS 'Count'
    FROM #us
    GROUP BY CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END

SELECT COALESCE(CAST(a AS NVARCHAR),'NULL') AS a,
        COUNT(COALESCE(CAST(a AS NVARCHAR),'NULL')) AS 'Count'
    FROM #us
    GROUP BY COALESCE(CAST(a AS NVARCHAR),'NULL')

1

अल्बर्टो से दूर, मैंने रोलअप को जोड़ा।

 SELECT [Narrative] = CASE 
 WHEN [Narrative] IS NULL THEN 'count_total' ELSE    [Narrative] END
,[Count]=SUM([Count]) FROM (SELECT COUNT(*) [Count], 'count_nulls' AS [Narrative]  
FROM [CrmDW].[CRM].[User]  
WHERE [EmployeeID] IS NULL 
UNION
SELECT COUNT(*), 'count_not_nulls ' AS narrative 
FROM [CrmDW].[CRM].[User] 
WHERE [EmployeeID] IS NOT NULL) S 
GROUP BY [Narrative] WITH CUBE;


1
select count(isnull(NullableColumn,-1))

2
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, क्यों और / या इस कोड के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करने से प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
विशाल छंदवानी

1

सभी उत्तर गलत या अत्यंत पुराने हैं।

इस क्वेरी को करने का सरल और सही तरीका COUNT_IFफ़ंक्शन का उपयोग कर रहा है।

SELECT
  COUNT_IF(a IS NULL) AS nulls,
  COUNT_IF(a IS NOT NULL) AS not_nulls
FROM
  us

0

यदि आप इसे एक ही रिकॉर्ड में चाहते हैं तो बस:

select 
  (select count(*) from tbl where colName is null) Nulls,
  (select count(*) from tbl where colName is not null) NonNulls 

;-)


0

गिनती के लिए शून्य मान नहीं

select count(*) from us where a is not null;

शून्य मानों की गिनती के लिए

 select count(*) from us where a is null;

1
सेशन ने सिंगल क्वेरी के लिए कहा :)
infografnet

0

मैंने १० पोस्टग्रेजों में तालिका बनाई और दोनों ने काम किया:

select count(*) from us

तथा

select count(a is null) from us


a IS NULLउत्पादन TRUEया FALSE, और COUNT () सभी पूर्ण मानों की गणना नहीं करेंगे। तो count(a is null)सभी पंक्तियों की गिनती लौटाएगा।
यप्रस्टो

0

मेरे मामले में मुझे कई कॉलमों में " अशक्त वितरण " चाहिए था:

SELECT
       (CASE WHEN a IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS a_null,
       (CASE WHEN b IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS b_null,
       (CASE WHEN c IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS c_null,
       ...
       count(*)
FROM us
GROUP BY 1, 2, 3,...
ORDER BY 1, 2, 3,...

'...' के अनुसार, यह अधिक स्तंभों तक आसानी से पहुंच योग्य है, जितने की आवश्यकता है


-1

उन तत्वों की संख्या जहां शून्य है:

select count(a) from us where a is null;

उन तत्वों की संख्या जहां शून्य नहीं है:

select count(a) from us where a is not null;

1
सवाल एक प्रश्न के लिए है।
ड्रीमव्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.