postgresql - sql - `সত্যের মানগুলির গণনা


98
myCol
------
 true
 true
 true
 false
 false
 null

উপরের সারণীতে, যদি আমি করি:

select count(*), count(myCol);

আমি পাই 6, 5

5এটি নাল এন্ট্রি গণনা না হিসাবে আমি পেতে ।

আমি কীভাবে সত্যের মানগুলির সংখ্যা গণনা করব (উদাহরণে 3)?

(এটি একটি সরলীকরণ এবং আমি আসলে গণনা কার্যের মধ্যে আরও জটিল অভিব্যক্তি ব্যবহার করছি)

সংক্ষিপ্তসার সম্পাদনা করুন: আমি ক্যোয়ারিতে একটি সরল গণনা (*) অন্তর্ভুক্ত করতে চাই, সুতরাং যেখানে একটি ধারা ব্যবহার করতে পারবেন না


'T' মিথ্যা জন্য সত্য anf 'f' এর পক্ষে দাঁড়ায়? অথবা আপনি কি নির্বাচন করুন COUNT (DISTINCT মাইক্রোল) এর মতো কিছু খুঁজছেন।
শিমিত ভার্মা

আমার দ্বিতীয় উদাহরণটি একবার দেখুন, WHERE myCol = trueআপনি চান সেখানে একটি নিক্ষেপ করতে পারেন এবং আপনি যদি প্রথমটি অপসারণ করেন তবে *,এটি কেবল নম্বরটি ফিরিয়ে দেবে।
ভোলআরন

@ শামিত হ্যাঁ টি সত্যের পক্ষে দাঁড়িয়েছে এবং এফ মিথ্যা, আমি প্রশ্নটি আপডেট করেছি
ইওহানএম

আপনি আপনার প্রশ্ন / ক্যোয়ারিকেও সহজতর করতে পারবেন না ... আপনার প্রয়োজনীয়তা আরও ভাল পারফরম্যান্স সম্ভাবনাগুলিকে সীমাবদ্ধ করে এবং লোকেরা অদক্ষ উত্তর দিয়ে সাড়া দিচ্ছে, যা কোনও উপযুক্ত কারণে অচল হয়ে পড়েছে।
ভোলআরন

4
আমার ডিফেন্সে @ ভোলআরন একটি বোধগম্য প্রশ্ন জিজ্ঞাসা করার জন্য কিছু সরলকরণ করতে হবে, তবে হ্যাঁ, আমি যখন মূল পোস্ট করেছি তখন আমি আরও প্রশস্ত করেছিলাম।
ইওহানম

উত্তর:


136
SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM <table name>

বা, যেমনটি আপনি নিজের জন্য খুঁজে পেয়েছেন:

SELECT count(CASE WHEN myCol THEN 1 END) FROM <table name>

এটি একটি ভাল হ্যাক এবং আমার কাছ থেকে সঠিক উত্তর পেয়েছে। যদি কেউ সংক্ষিপ্ত সমাধান না নিয়ে আসে তবে আমি তা গ্রহণ করব?
EoghanM

4
এছাড়াও, কোনও কারণ আপনি কেন গণনার পরিবর্তে (.. তত আগে 1 টি এলএস 0) করেছেন (.. তবে অন্যটি নাল?)
ইওহানম

5
না ... এটি ঠিক যে আমি নিশ্চিত নই যে কোন মানগুলি () গণনা করবে ... এবং আমি জানতাম যে যোগটি কৌশলটি করেছে। তবে সাবধান থাকুন: দ্বিতীয় ভাবাতে আমি বিশ্বাস করি যে কেবলমাত্র নাল মানগুলির চেয়ে বেশি () যোগফল বাতিল হয়ে যাবে, সুতরাং এটি আপনার পক্ষে সমষ্টি (যোগফল (...), 0) হওয়া উচিত, বা অন্য কথায়, গণনা () ভাল,
ড্যানিয়েল

4
@ ইওহানম, কাস্টের সাথে জড়িত সংক্ষিপ্ত উত্তর দেখুন।
ডোয়াইন টাওয়েল

4
আপনি ELSE nullএকই ফলাফলটি পেতে বাদ দিতে পারেন।
200_সাক্সেস

92

বুলিয়ানকে একটি পূর্ণসংখ্যা এবং যোগফলকে কাস্ট করুন।

SELECT count(*),sum(myCol::int);

আপনি পেতে 6,3


4
প্লাস 1: দুর্দান্ত হ্যাক! এটি আমার সমাধানের চেয়ে সম্ভবত আরও দ্রুত।
ড্যানিয়েল

4
এটি সেরা এবং সংক্ষিপ্ততম সমাধান (এবং অন্যান্য অনেক প্রোগ্রামিং এনভায়রনমেন্ট এবং সফ্টওয়্যার এর সমতুল্য রয়েছে)। আরও আপ-ভোট দেওয়া উচিত

4
'কাস্ট টু ইন্ট অ্যান্ড কাউন্ট' স্পষ্টভাবে সর্বাধিক সংক্ষিপ্ত, তবে এটি সেরা করে না। আমি এটিকে সমর্থন করব না, কারণ অনেকগুলি পরিবেশ মিথ্যা / সত্যের জন্য 0/1 উপস্থাপনা ব্যবহার করার সময়, অনেকে -1 সহ 0 / অ-শূন্য ব্যবহার করে। আমি সম্মত হই যে এটি একটি "হ্যাক" এবং ক্যাসেটগুলি যখন "হ্যাক" না হয় তখন পর্যাপ্ত ধরণের হয়। ডাউন ডাউন হবে না আবার, সমর্থন করবে না।
অ্যান্ড্রু ওল্ফ

87

যেহেতু পোস্টগ্র্যাসকিউএল 9.4 এর FILTERধারা রয়েছে , যা খুব সংক্ষিপ্ত প্রশ্নের জন্য সত্য মানগুলি গণনা করতে দেয়:

select count(*) filter (where myCol)
from tbl;

উপরের ক্যোয়ারীটি একটি খারাপ উদাহরণ যা একটি সাধারণ যেখানে শর্তটি যথেষ্ট হবে, এবং এটি কেবল বাক্য গঠন প্রদর্শনের জন্য। ফিল্টার ক্লজটি যেখানে জ্বলজ্বল করে তা হ'ল অন্যান্য সমষ্টিগুলির সাথে একত্রিত করা সহজ:

select count(*), -- all
       count(myCol), -- non null
       count(*) filter (where myCol) -- true
from tbl;

এই ধারাটি বিশেষত কোনও কলামে প্রিকিকেট হিসাবে অন্য কলামকে ব্যবহার করে এমন একটি কলামে সমষ্টিগুলির জন্য কার্যকর, যখন একটি একক ক্যোয়ারিতে আলাদাভাবে ফিল্টার করা সমষ্টি আনতে দেয়:

select count(*),
       sum(otherCol) filter (where myCol)
from tbl;

4
এটি পিজি> 9.4 এর সেরা উত্তর এবং অবিশ্বাস্যরকম দ্রুত
জুয়ান রিকার্ডো

47

সম্ভবত, সেরা পদ্ধতির হল নুলিফ ফাংশন ব্যবহার করা।

সাধারণভাবে

select
    count(nullif(myCol = false, true)),  -- count true values
    count(nullif(myCol = true, true)),   -- count false values
    count(myCol);

বা সংক্ষেপে

select
    count(nullif(myCol, true)),  -- count false values
    count(nullif(myCol, false)), -- count true values
    count(myCol);

http://www.postgresql.org/docs/9.0/static/function-conditional.html


4
আপনার কেমন লাগে ভুল "সাধারণ": AFAICS, nullif([boolean expression], true)ফিরে আসবে falseযদি [বুলিয়ান অভিব্যক্তি] মিথ্যা, এবং nullযদি এটা সত্য, যাতে আপনি মিথ্যা মান গণনা করা হবে না। আমি মনে করি আপনি চান nullif([boolean expression], false)
rjmunro

হ্যাঁ, "সাধারণ" কেসটি অন্যদিকে হওয়া উচিত। স্থির ধন্যবাদ
wrobell

4
ইউক এই সংশোধন সত্যিই বিভ্রান্তিকর। আফিক্স, এটি এখন সত্য বা নাল মান গণনা করবে। আমি মনে করি যে এটি পুনরায় করা যাতে আপনার সর্বদা থাকে nullif([boolean expression], false)এটি পড়া সহজ করে তোলে। এরপরে আপনি বুলিয়ান এক্সপ্রেশন অংশটি যা পছন্দ করেন তা পরিবর্তিত করতে পারেন, এই ক্ষেত্রে myCol = trueসত্যিকার মানগুলি গণনা করা, বা myCol = falseভুয়া মানগুলি গণনা করা, বা name='john'জন ইত্যাদি নামক লোক গণনা করা
rjmunro

20

সংক্ষিপ্ততম এবং সবচেয়ে অলসতম (castালাই ছাড়াই) সমাধানটি সূত্রটি ব্যবহার করা হবে:

SELECT COUNT(myCol OR NULL) FROM myTable;

এটি নিজে চেষ্টা করো:

SELECT COUNT(x < 7 OR NULL)
   FROM GENERATE_SERIES(0,10) t(x);

তুলনায় একই ফলাফল দেয়

SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END)
   FROM GENERATE_SERIES(0,10) t(x);

এটি অবশ্যই আমার চেয়ে দুর্দান্ত সমাধান :)
ড্যানিয়েল

খুব অন্তর্দৃষ্টিপূর্ণ উত্তর।
লুকাসারুদা

7

মাইএসকিউএল এ আপনি এটিও করতে পারেন:

SELECT count(*) AS total
     , sum(myCol) AS countTrue --yes, you can add TRUEs as TRUE=1 and FALSE=0 !!
FROM yourTable
;

আমার মনে হয় পোস্টগ্র্রেসে এটি কাজ করে:

SELECT count(*) AS total
     , sum(myCol::int) AS countTrue --convert Boolean to Integer
FROM yourTable
;

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

SELECT count(*) AS total
     , sum(CAST(myCol AS int)) AS countTrue --convert Boolean to Integer
FROM yourTable
;

এটি ^ _ ^
JiaHao Xu

7
select f1,
       CASE WHEN f1 = 't' THEN COUNT(*) 
            WHEN f1 = 'f' THEN COUNT(*) 
            END AS counts,
       (SELECT COUNT(*) FROM mytable) AS total_counts
from mytable
group by f1

অথবা এই হতে পারে

SELECT SUM(CASE WHEN f1 = 't' THEN 1 END) AS t,
       SUM(CASE WHEN f1 = 'f' THEN 1 END) AS f,
       SUM(CASE WHEN f1 NOT IN ('t','f') OR f1 IS NULL THEN 1 END) AS others,
       SUM(CASE WHEN f1 IS NOT NULL OR f1 IS NULL THEN 1 ELSE 0 END) AS total_count
FROM mytable;

+1 টি যদি myColঅভিব্যক্তি একটি বুলিয়ান হয়, তাহলে আপনি সাথে চেক প্রতিস্থাপন করতে পারেনwhere (myCol)
ypercubeᵀᴹ

দুঃখিত, আমি আমার উদাহরণটি ছাপিয়েছি: আমি এমন একটি ধারা ব্যবহার করতে পারি না কারণ আমি সারিগুলির মোট সংখ্যার প্রতিনিধিত্ব করে এমন একটি সত্য গণনা এবং সত্যিকারের মানগুলির গণনাও ফিরিয়ে দিতে চাই count
ইওহানম

7

কেবল বুলিয়ান ক্ষেত্রটিকে পূর্ণসংখ্যায় রূপান্তর করুন এবং একটি যোগফল করুন। এটি পোস্টগ্র্যাস্কলটিতে কাজ করবে:

select sum(myCol::int) from <table name>

আশা করি এইটি কাজ করবে!


অন্যান্য সমাধানগুলির তুলনায় এটি তাত্পর্যপূর্ণ বা নির্ভুল নয়। আমি বিশ্বাস করি যে বুলেটিয়ান আপনার জন্য আরও স্বজ্ঞাত হিসাবে ইনটগুলি ব্যবহার করার সময় আপনি ওরাকল থেকে এসেছেন।
ড্যানিয়েল

4
SELECT count(*)         -- or count(myCol)
FROM   <table name>     -- replace <table name> with your table
WHERE  myCol = true;

উইন্ডোইং ফাংশন সহ এখানে একটি উপায়:

SELECT DISTINCT *, count(*) over(partition by myCol)
FROM   <table name>;

-- Outputs:
-- --------------
-- myCol | count
-- ------+-------
--  f    |  2
--  t    |  3
--       |  1

দুঃখিত আমি আরও জটিল উদাহরণের জন্য একাধিক সারি ফিরতে পারি না আমি এই সমাধানটিতে প্রয়োগ করছি।
EoghanM

হ্যাঁ, তবে আপনি কেবল যোগ করে এটি আরও সীমাবদ্ধ করতে পারেন WHERE myCol = true। আমি দ্বিতীয় উদাহরণটি সরবরাহ করেছি কারণ এটি কোনও দ্রুত নয়, তবে পোস্টগ্র্রেসের উইন্ডোটিং ফাংশনগুলিতে শিক্ষামূলক টুকরো হিসাবে বেশি, যা অনেক ব্যবহারকারী আরামদায়ক নয় বা জানেন না।
ভোলআরন

0
select count(myCol)
from mytable
group by myCol
;

দিনের মতো অন্য কলামের সাথে একত্রিত হওয়ার সময় তিনটি সারিতে তিনটি সম্ভাব্য রাজ্যের বুল (মিথ্যা, সত্য, 0) বিশেষত কার্যকর হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.