একটি একক ক্যোয়ারিতে নাল এবং নন-নাল মান গণনা করা


141

আমার একটা টেবিল আছে

create table us
(
 a number
);

এখন আমার মতো ডেটা রয়েছে:

a
1
2
3
4
null
null
null
8
9

ক কলামের নাল এবং শূন্য মানগুলি গণনা করার জন্য আমার এখন একক কোয়েরি দরকার need


3
হাই, আপনার কোথা থেকে এই জাতীয়
গণনাঙ্কের

2
আমি অবাক হয়েছি কোনও
উত্তরেই

1
@ লিভেন: পৃথিবীতে আপনি unionএখানে কেন ব্যবহার করবেন ? মনট্রিস্টোর উত্তরটি এখন পর্যন্ত সবচেয়ে ভাল সমাধান।
এরিক

1
কারণ ওপি এটি একটি একক ক্যোয়ারী সহ চায়। মন্টেক্রিস্টোর উত্তর অবশ্যই সর্বোত্তম সমাধান ... তার কেবল ইউনিয়ন যুক্ত করা দরকার :)
লাইভেন কের্মসেকার্স

1
এবং এটিই আমি শিরোনামটি পড়ার জন্য পাই। সম্পাদনা করবে।
এরিক

উত্তর:


231

এটি ওরাকল এবং এসকিউএল সার্ভারের জন্য কাজ করে (আপনি এটি অন্য আরডিবিএমএসে কাজ করতে সক্ষম হতে পারেন):

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

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি একটি কলামে সমস্ত নাল এবং সমস্ত নাল গণনা করতে চান ...

যদি এটি সঠিক হয়:

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
হ্যাঁ তবে না আমি মনে করি তিনি কেবল একটি ক্যোয়ারিতে
ন্যূনল

@রোমিনতাজ: একদম ঠিক আছে। আমি প্রশ্ন হিসাবে শিরোনাম পড়েছি। পাঁচটি সম্পাদনায়, কেউ এটিকে ঠিক করার চিন্তা করেনি। Yeesh।
এরিক

@ রমিনতাজ: হ্যাঁ আপনি ঠিক বলেছেন, "আমাদের কত নাল রয়েছে তা চিহ্নিত করার জন্য একবার রানার ক্যোয়ারী" হিসাবে আমি এটিকে গ্রহণ করেছি ", কেন জানি না কেন ^^ ', সংশোধন করতে চলেছি, ধন্যবাদ।
আলবার্তো জ্যাকাগেনি

1
@ মনট্রিস্টো: কারণ শিরোনামটি কেবল গণনা চেয়েছিল null:)
এরিক

42

এখানে একটি দ্রুত এবং নোংরা সংস্করণ রয়েছে যা ওরাকলে কাজ করে:

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
অনুরূপ সিনট্যাক্স এসকিউএল সার্ভারেও কাজ করবে। এছাড়াও, এইভাবে এটি করা কেবল একবার টেবিলটি স্ক্যান করবে; ইউনিয়ন সমাধান দুটি টেবিল স্ক্যান করবে। ছোট টেবিলগুলির জন্য অপ্রাসঙ্গিক, বিশালাকারগুলির জন্য খুব গুরুত্বপূর্ণ।
ফিলিপ কেলি

2
SQL সার্ভার জন্য শুধুমাত্র পরিবর্তন "Null values"পরিণত হবে 'Null values'। একক উদ্ধৃতি, ডাবল নয়।
এরিক

1
এসকিউএল সার্ভার এই ক্যোয়ারির জন্য একটি সূচক স্ক্যান ব্যবহার করে বনাম দুটি সূচক একটি ইউনিয়ন ব্যবহার করে। 40.000 সারি সহ একটি টেবিলে, গতির কোনও পার্থক্য নেই।
লিভেন কের্মসেকাররা

1
11.332.581 সারি সহ একটি টেবিলে দুটি টেবিল স্ক্যান রয়েছে , উল্লেখযোগ্য গতির পার্থক্য নেই (প্রকৃতপক্ষে, ইউনিয়নটি কিছুটা দ্রুত)।
লিভেন কের্মসেকার্স

1
এটি ওরাকল 11 জি-তে আমার পক্ষে কাজ করে নি। "ব্যবহারকারীর 155789" সংস্করণটি "কেস যখন নাল হয় তারপরে 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
আমার কাছে দেখার মতো কোনও ডাটাবেস নেই, তবে হয় কলামটি সূচিবদ্ধ হয়। যদি এটি হয় তবে এটি একটি পরিসীমা স্ক্যানের মাধ্যমে ঘটে otherwise অন্যথায়, আপনি পুরো টেবিল স্ক্যানের সাথে অনেকটা দূরে রয়েছেন। ওরাকলে, এনএইউএলগুলি সূচকে সংরক্ষণ করা হয় না, তাই আমি সন্দেহ করি আপনার উদাহরণটি আরও ভাল নয়। আপনার মাইলেজ খুব পারে।
এভিলটিচ

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। সুতরাং যখন আমরা ব্যবহার COUNT (*) ক্যোয়ারী ইঞ্জিন গন্য সারির সংখ্যা, তাই আমরা 16 যেমন কিন্তু ক্ষেত্রে গণনা ফলাফল পেয়েছি COUNT (empid) কলাম অ শূন্য মান গণনা করা হয়েছে empid । সুতরাং আমরা 14 হিসাবে ফলাফল পেয়েছি।

সুতরাং আমরা যখনই COUNT (কলাম) ব্যবহার করছি তখন নিশ্চিত হয়ে নিন যে আমরা নীচের মত বর্ণিত নালাগুলির যত্ন নিই।

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

NULL এবং নন-নুল উভয় মান গণনা করবে।

দ্রষ্টব্য : টেবিলটি একাধিক কলামের তৈরি হয়ে গেলেও একই জিনিস প্রয়োগ হয়। গণনা (1) NULL / নন- NULL মান নির্বিশেষে মোট সারির সংখ্যা দেবে। কেবল যখন কলাম (কলাম) ব্যবহার করে কলামের মান গণনা করা হয় কেবল তখনই আমাদের NUL মানগুলির যত্ন নেওয়া দরকার।


4

আমার একটি অনুরূপ সমস্যা ছিল: সমস্ত স্বতন্ত্র মান গণনা করতে, নাল মানগুলিও 1 হিসাবে গণনা করা। একটি সাধারণ গণনা এই ক্ষেত্রে কার্যকর হয় না, কারণ এটি নাল মানগুলিকে বিবেচনা করে না।

এখানে একটি স্নিপেট যা এসকিউএল-এ কাজ করে এবং নতুন মান নির্বাচন করে না। মূলত, একবার স্বতন্ত্র সম্পাদন করার পরে, নতুন কলামে সারি নম্বরটিও ফিরে আসে (এন) সারি_নম্বার () ফাংশনটি ব্যবহার করে, তারপরে সেই কলামটিতে একটি গণনা সম্পাদন করুন:

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

আপনি যদি এমএস এসকিএল সার্ভার ব্যবহার করেন ...

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 (পরিস্থিতি যখন 1 ই এলএসই শেষ হয় না)
ভ্লাদিস্লাভ

1

যদি এর মাইএসকিএল হয় তবে আপনি এটির মতো কিছু চেষ্টা করতে পারেন।

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

এটি কৌতুকপূর্ণ, তবে এটি নল বনাম নালগুলির গণনা নির্দেশ করে ২ টি কলস সহ একটি একক রেকর্ড প্রদান করবে।


1

এটি টি-এসকিউএল-এ কাজ করে। যদি আপনি কেবল কোনও কিছুর সংখ্যা গণনা করছেন এবং আপনি নালগুলি অন্তর্ভুক্ত করতে চান তবে কেসের পরিবর্তে 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;


0

আমি পোস্টগ্রিজ 10 এ টেবিলটি তৈরি করেছি এবং নিম্নলিখিত দু'টিই কাজ করেছেন:

select count(*) from us

এবং

select count(a is null) from us


a IS NULLউত্পাদন করে TRUEবা FALSE, এবং COUNT () সমস্ত নাল মান গণনা করবে। সুতরাং count(a is null)সমস্ত সারি গণনা ফিরে আসবে।
ypresto

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
প্রশ্নটি একটি একক প্রশ্নের জন্য।
ড্রিমওয়েভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.