গণনা () এ শর্ত নির্দিষ্ট করা সম্ভব?


391

শর্তটি নির্দিষ্ট করা কি সম্ভব Count()? আমি কেবলমাত্র সারিগুলি গণনা করতে চাই যা উদাহরণস্বরূপ, অবস্থান কলামে "ম্যানেজার"।

আমি এটি গণনা বিবৃতিতে করতে চাই, ব্যবহার না করে WHERE; আমি এটা সম্পর্কে জিজ্ঞেস করছি কারণ আমি একই উভয় পরিচালকের ও অন্যান্য গোনার দরকার SELECT(কিছু Count(Position = Manager), Count(Position = Other))তাই WHEREএই উদাহরণে আমার জন্য কোন ব্যবহার।


4
সকল * ব্যবহারকারীর জন্য বু, গণনা (সামান্য কলামউইনইউর টেবিল) ব্যবহার করুন যেখানে অবস্থান = 'পরিচালক'
মার্ক ডিকিনসন

6
@ মার্ক: সমস্ত আধুনিক ডাটাবেসে, এটি কোনও পার্থক্য করে না ।
ফিলিপ লেবার্ট

4
@ মার্ক এবং ফিলিপ: আসলে এটি একটি গ্রেট পার্থক্য করতে পারে। যদি ক্ষেত্রটি স্থূল হয় এবং সূচকযুক্ত না হয়, তবে ক্যোয়ারিকে সারণীতে প্রতিটি রেকর্ড স্পর্শ করা দরকার, সুতরাং গণনা (*) এবং গণনা (ক্ষেত্র) ব্যবহার করে ডিফারনেট ফলাফল এবং বিভিন্ন পারফরম্যান্স দেওয়া যায়।
গুফা 14

3
আমি কয়েক বছর ধরে গণনা (*) বনাম গণনা (এক্স) এর কার্যকর করার পরিকল্পনাগুলি বিশ্লেষণ করেছি এবং এখনও পর্যন্ত আমি এমন একটিও পাইনি যা পারফরম্যান্সে পার্থক্য দেখিয়েছিল। সে কারণেই আমি সত্যিই কোনও ক্যোয়ারির উদাহরণ দেখতে চাই যেখানে পার্থক্য রয়েছে।
ফিলিপ লেবার্ট 14

2
@ ম্যাথেজ: আমরা কথা বলছি না SELECT *, তবে SELECT COUNT(*), যা একেবারে ভিন্ন জন্তু।
ফিলিপ লেবার্ট

উত্তর:


663

আপনি যদি কেবল একটি whereক্লজ দিয়ে ক্যোয়ারিকে সীমাবদ্ধ করতে না পারেন তবে আপনি এই তথ্যটি ব্যবহার করতে পারেন যে countসমষ্টি কেবল নন-মানগুলি গণনা করে:

select count(case Position when 'Manager' then 1 else null end)
from ...

আপনি sumসমষ্টিও একইভাবে ব্যবহার করতে পারেন :

select sum(case Position when 'Manager' then 1 else 0 end)
from ...

আমার ক্ষেত্রটি যদি পূর্ণসংখ্যার হয় এবং আমি শূন্যের সাথে মেলে দেখতে চাই what এটি এইভাবে কাজ করে না কাজটি নির্বাচন করুন (কেস ইন্টিজারফিল্ড যখন 'নুল' হবে তারপরে আরও 1 টি নাল শেষ হবে) থেকে
ফাইজান

2
@ ফাইজান nullবিশেষ। ব্যবহারcase when IntegerField is null then ...
পিট ব্রিটস

বুলিয়ান ক্ষেত্রগুলির সাথে কাজ করার সময় আপনি এটি ব্যবহার করতে পারেন:SUM(CONVERT(int, IsManager))
সাইমন_উইভার

2
এসকিউএল সার্ভার বিবৃতিগুলির else nullজন্য একটি বোঝায় case, সুতরাং count()উদাহরণটি 10 ​​টি অক্ষর ছোট হতে পারে (যদি আপনি স্থানটি গণনা করেন)।
মাইকেল - ক্লে শিরকি কোথায়

212

ধরে নিই যে আপনি ফিরে আসা সারিগুলিকে সীমাবদ্ধ করতে চান না কারণ আপনি অন্যান্য মানগুলিও সংযুক্ত করছেন, আপনি এটি এটি করতে পারেন:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...

আসুন আমরা একই কলামের মধ্যে বলি যে আপনি ম্যানেজার, সুপারভাইজার এবং টিম লিডের মানগুলি পেয়েছিলেন, আপনি প্রতিটি এরকম নম্বর পেতে পারেন:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount,
    count(case when Position = 'Supervisor' then 1 else null end) as SupervisorCount,
    count(case when Position = 'Team Lead' then 1 else null end) as TeamLeadCount,
from ...

3
@RedFilter এটা এমনকি নির্দিষ্ট করতে প্রয়োজন elseশুধু, অংশ endএটা সঠিক পর 1
ডেনিস ভালিভ

7
@ ডেনিস: সঠিক - আমি প্রায়শই elseএটিকে ছেড়ে দিয়ে থাকি কারণ এটি মামলার বিবরণের ফলাফলগুলি বিশেষত নভি এসকিউএল বিকাশকারীদের জন্য আরও ভাল নথি করে দেয়। বংশবৃদ্ধির জন্য, এই ক্ষেত্রে এটি সরানো যেতে পারে।
রেডফিল্টার

30

@ গুফার উত্তরটি দুর্দান্ত, কেবলমাত্র এটি উল্লেখ করুন যে কোনও আইএফ স্টেটমেন্ট দিয়ে ক্লিনার হতে পারে

select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...

21

আপনি যা বলতে চান তা নির্ভর করে তবে অর্থের অন্য ব্যাখ্যাটি যেখানে আপনি একটি নির্দিষ্ট মান দিয়ে সারিগুলি গণনা করতে চান তবে SELECTসেই সারিগুলিকে কেবল সীমাবদ্ধ রাখতে চান না ...

আপনি এটি ব্যবহার SUM()করার পরিবর্তে এই জাতীয় শৃঙ্খলা দ্বারা এটি করতে চাই COUNT(): যেমন

SELECT SUM(CASE WHEN Position = 'Manager' THEN 1 ELSE 0 END) AS ManagerCount,
    SUM(CASE WHEN Position = 'CEO' THEN 1 ELSE 0 END) AS CEOCount
FROM SomeTable

13

আপনি এসকিউএল 2005 বা ততোধিক ব্যবহার করে থাকলে আপনি পিভট কীওয়ার্ডও ব্যবহার করতে পারেন

আরও তথ্য এবং টেকনেট থেকে

SELECT *
FROM @Users
PIVOT (
    COUNT(Position)
    FOR Position
    IN (Manager, CEO, Employee)
) as p

পরীক্ষা ডেটা সেট

DECLARE @Users TABLE (Position VARCHAR(10))
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('CEO')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')

5

আপনি কি ঠিক এটি বোঝাতে চান:

SELECT Count(*) FROM YourTable WHERE Position = 'Manager'

যদি তাই হয়, তবে ইউপ যে কাজ করে!


1
সম্পাদনাটি দেখায় যে তিনি কোনও সারির সাথে সারিগুলি সীমাবদ্ধ করতে চান না
কিনস্লেয়ারু

4

আমি জানি এটি সত্যিই পুরানো, তবে আমি এই NULLIFজাতীয় দৃশ্যের কৌশলটি পছন্দ করি এবং এখনও অবধি কোনও উত্সাহ পাইনি। শুধু আমার অনুলিপি এবং পেস্টযোগ্য উদাহরণ দেখুন, যা যদিও খুব ব্যবহারিক নয় তবে এটি কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করে।

NULLIF পারফরম্যান্সে আপনাকে একটি ছোট নেতিবাচক প্রভাব দিতে পারে, তবে আমার ধারণা এটি এখনও সাবকোয়ারির চেয়ে দ্রুত হওয়া উচিত।

DECLARE @tbl TABLE ( id [int] NOT NULL, field [varchar](50) NOT NULL)

INSERT INTO @tbl (id, field)
SELECT 1, 'Manager'
UNION SELECT 2, 'Manager'
UNION SELECT 3, 'Customer'
UNION SELECT 4, 'Boss'
UNION SELECT 5, 'Intern'
UNION SELECT 6, 'Customer'
UNION SELECT 7, 'Customer'
UNION SELECT 8, 'Wife'
UNION SELECT 9, 'Son'

SELECT * FROM @tbl

SELECT 
    COUNT(1) AS [total]
    ,COUNT(1) - COUNT(NULLIF([field], 'Manager')) AS [Managers]
    ,COUNT(NULLIF([field], 'Manager')) AS [NotManagers]
    ,(COUNT(1) - COUNT(NULLIF([field], 'Wife'))) + (COUNT(1) - COUNT(NULLIF([field], 'Son'))) AS [Family]
FROM @tbl

মন্তব্য প্রশংসা :-)



2

আমি মনে করি আপনি কেবল কয়েকটি রেকর্ড গণনা নির্বাচন করতে একটি সহজ WHERE ধারা ব্যবহার করতে পারেন।


আমি কেন ডাউন ভোট পাব? আমি উত্তর দেওয়ার পরে (বা একই সময়ে হতে পারে), অনেক লোক একই জিনিসটির উত্তর দেয় এবং তারা কোনও ডাউনওয়েট পায় না। / :(
নওয়ামন

4
আপনি একটি ডাউনভোট পান কারণ প্রশ্নটি "গণনায় শর্ত নির্দিষ্ট করুন" নয় "শর্ত অনুসারে মান গণনা করুন" is সুতরাং আপনি ভুল প্রশ্নের উত্তর
দিচ্ছেন

3
উত্তরটি নিম্নোক্ত করা কিছুটা অন্যায়, যখন উত্তরটি লেখা হয়েছিল তখনই প্রশ্নের সঠিক সমাধান ছিল .... তিনি এই উত্তরের 4 মিনিটের পরে অতিরিক্ত পাঠ্য যুক্ত করেছেন!
পিটার

2

প্রতিটি শিপিং কনটেইনারটির মধ্যে মান এবং মানদণ্ডের পরিপূর্ণতার সাথে মোট এবং সংখ্যা উভয়ই অন্তর্ভুক্ত করে এমন একটি ডেটা সেট পেতে আমি এখানে যা করেছি। এটি আমাকে প্রশ্নের উত্তর দিতে দাও "কয়টি শিপিং কনটেইনারে ৫০ আকারের বেশি এক্স% আইটেম রয়েছে"

select
   Schedule,
   PackageNum,
   COUNT (UniqueID) as Total,
   SUM (
   case
      when
         Size > 51 
      then
         1 
      else
         0 
   end
) as NumOverSize 
from
   Inventory 
where
   customer like '%PEPSI%' 
group by
   Schedule, PackageNum

1

PrestoDB এসকিউএল (ফেসবুক থেকে) সহ নোট করুন, একটি শর্টকাট রয়েছে:

https://prestodb.io/docs/current/functions/aggregate.html

গণনা_ফ (x) → বিগিন্ট

TRU ইনপুট মানগুলির সংখ্যা প্রদান করে। এই ফাংশনটি গণনার সমতুল্য (যখন শেষ 1 তম শেষ)


-4

এটি ব্যবহার করে আপনি পরিচালকদের জন্য গণনা পাবেন

Select Position, count(*) as 'Position Counter'
from your_table 
group by Position 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.