একটি COUNTIF সামগ্রিক ফাংশনের সমতুল্য স্কেল সার্ভার function


164

আমি এমন একটি GROUP BYধারা নিয়ে একটি ক্যোয়ারী তৈরি করছি যা কেবলমাত্র একটি নির্দিষ্ট শর্তের ভিত্তিতে রেকর্ড গণনা করার দক্ষতার প্রয়োজন (যেমন কেবলমাত্র রেকর্ডগুলি গণনা করুন যেখানে নির্দিষ্ট কলামের মান 1 এর সমান হয়)।

SELECT  UID, 
        COUNT(UID) AS TotalRecords, 
        SUM(ContractDollars) AS ContractDollars,
        (COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM    dbo.AD_CurrentView
GROUP BY UID
HAVING  SUM(ContractDollars) >= 500000

COUNTIF()লাইন স্পষ্টত ব্যর্থ যেহেতু কোন নেটিভ SQL এর ফাংশন বলা হয় COUNTIF, কিন্তু এখানে ধারণা সব সারি MyColumn জন্য মান '1' আছে শতাংশ নির্ধারণ করা হয়।

এমএস এসকিউএল 2005 পরিবেশে এটি কীভাবে সঠিকভাবে প্রয়োগ করা যায় সে সম্পর্কে কোনও চিন্তাভাবনা?

উত্তর:


339

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

SELECT SUM(CASE WHEN myColumn=1 THEN 1 ELSE 0 END)
FROM AD_CurrentView

দ্রষ্টব্য: আমার নিজের পরীক্ষায় NULLএটি কোনও সমস্যা ছিল না, যদিও এটি পরিবেশ নির্ভর হতে পারে। আপনি নালগুলি যেমন পরিচালনা করতে পারেন:

SELECT SUM(CASE WHEN ISNULL(myColumn,0)=1 THEN 1 ELSE 0 END)
FROM AD_CurrentView

3
(আমি জানি যে ওপি এমএস এসকিউএল সম্পর্কে জিজ্ঞাসা করেছিল, তবে এসকিউএলাইট ব্যবহারকারীরা একই কাজটি করার জন্য কেবল একটি ক্ষুদ্র মন্তব্য) এসকিউএলাইটের ISNULLপরিবর্তে আপনি যা করতে পারেন CASE WHEN myColumn IS NULLবা ব্যবহার করতে পারেন ifnull( স্ট্যাকওভারফ্লো.com / a / 799406 / 1861346 )
ম্যাট

54

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

আপনি এই ঘটনাটি গ্রহণ করতে পারেন যে COUNT (কলামনাম) NULL গণনা করে না এবং এই জাতীয় কিছু ব্যবহার করে:

SELECT COUNT(NULLIF(0, myColumn))
FROM AD_CurrentView

নুল্লিফ - মানগুলিতে পাস হওয়া দুটি একই হয় তবে নুলকে ফেরত দেয়।

সুবিধা: SUM () স্বরলিপি দেওয়ার পরিবর্তে COUNT টি সারিতে আপনার অভিপ্রায় প্রকাশ করে। অসুবিধা: এটি কীভাবে কাজ করছে তা পরিষ্কার নয় ("ম্যাজিক" সাধারণত খারাপ)।



পুরানো পোস্ট, তবে ধন্যবাদ এটি সাহায্য করেছে। আমি জাদু বাড়ানো এবং যোগ করে "শুধুমাত্র NULLs" সমস্যা কাছাকাছি পেয়েছিলাম ISNULLনিম্নরূপ: SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))। অপেক্ষা করুন, এটি দেখতে কেবল কুৎসিত দেখাচ্ছে ...
পিসিদেব

1
যদি সেখানে ছিল একটি NULLIFNOT ফাংশন নিখুঁত হতে হবে
qwertzguy

21

আমি এই সিনট্যাক্স ব্যবহার করব। এটি জোশ এবং ক্রিসের পরামর্শগুলির মতো একইরূপে পৌঁছেছে তবে সুবিধাটি সহ এটি এএনএসআই প্রশংসিত এবং নির্দিষ্ট ডাটাবেস বিক্রেতার সাথে আবদ্ধ নয়।

select count(case when myColumn = 1 then 1 else null end)
from   AD_CurrentView

2
ক্রিসের উত্তরটি স্ট্যান্ডার্ড এসকিউএল অনুবর্তী (ইঙ্গিত: NULLIFস্ট্যান্ডার্ড এসকিউএল -২২ অন্তর্ভুক্ত)। জোশ এর উত্তর সহজে প্রতিস্থাপন স্ট্যান্ডার্ড SQL এর রুপান্তরিত করা যেতে পারে isnullসঙ্গে COALESCE
onedaywhen

আমি আসলে এই উত্তরটি সবচেয়ে ভাল পছন্দ করি কারণ ক্রিস যে "সারি গণনা করছে" তার ধারণা পেয়েছে তবে এটি আরও বর্ধিত, কারণ আপনি যে কোনও তুলনামূলক অপারেটর ব্যবহার করতে পারেন; না শুধু =। আমি এটি "প্রতিক্রিয়া সংখ্যা> = 2" গণনা করার জন্য ব্যবহার করছি।
ক্রিস্টেন হাম্ম্যাক

3

জোশের উত্তরে যুক্ত করা,

SELECT COUNT(CASE WHEN myColumn=1 THEN AD_CurrentView.PrimaryKeyColumn ELSE NULL END)
FROM AD_CurrentView

আমার জন্য (এসকিউএল সার্ভারে 2012) ভালভাবে কাজ করেছে 'গণনা' কে একটি 'যোগফল' এ পরিবর্তন না করে এবং একই যুক্তিটি অন্যান্য 'শর্তসাপেক্ষ সমষ্টিগুলিতে' বহনযোগ্য। উদাহরণস্বরূপ, একটি শর্তের ভিত্তিতে যোগফল:

SELECT SUM(CASE WHEN myColumn=1 THEN AD_CurrentView.NumberColumn ELSE 0 END)
FROM AD_CurrentView

2

কেমন

SELECT id, COUNT(IF status=42 THEN 1 ENDIF) AS cnt
FROM table
GROUP BY table

এর চেয়ে কম CASE:)

কাজ করে কারণ COUNT()শূন্য মানগুলি গণনা করা হয় না, এবং IF/ CASEযখন শর্ত পূরণ না হয় এবং কোনও নেই তখন নাল ফেরান ELSE

আমি মনে করি এটি ব্যবহার করার চেয়ে ভাল SUM()


1

পণ্য নির্দিষ্ট নয়, তবে এসকিউএল মান সরবরাহ করে

SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...

এই উদ্দেশ্যে. বা এমন কিছু যা এর সাথে সাদৃশ্যপূর্ণ, আমি আমার টুপিটির উপরের অংশটি জানি না।

এবং অবশ্যই বিক্রেতারা তাদের মালিকানা সমাধানের সাথে লেগে থাকতে পছন্দ করবেন।


1
আমি এর আগে কখনও শুনিনি, তাই আমি এটি সন্ধান করলাম। আধুনিক- এসকিএল.এফ.এল . / ফিচার / ফিল্টার অনুসারে একমাত্র বড় ডিবিএমএস যা প্রকৃতপক্ষে ক্লজটি সরবরাহ করে FILTERতা হ'ল পোস্টগ্র্যাস এসকিউএল, তবে এটি CASEসকলের দ্বারা অনুকরণ করা হয়।
ক্রিস্টেন হাম্মাক

1

কেন এ জাতীয় নয়?

SELECT count(1)
FROM AD_CurrentView
WHERE myColumn=1

1
কারণ তার শুধু দরকার গণনার চেয়ে আরও অনেক কিছু। তিনি একটি গোষ্ঠীর কোনও অংশের সার্বিক হিসাব পাওয়ার চেষ্টা করছেন এবং তারপরে পুরো গোষ্ঠীর একটি সমষ্টি, যা আপনি WHERE সহ করতে পারবেন না।
ক্রিস্টেন হাম্মাক

1

আমার নির্বাচিত কলামগুলির অংশ হিসাবে আমাকে আমার ক্ষেত্রে COUNTIF () ব্যবহার করতে হয়েছিল এবং প্রতিটি ফলাফল আমার ফলাফলগুলির সংখ্যার নকল করতে হয়েছিল to

তাই আমি এটি ব্যবহার করেছি ...

SELECT COL1, COL2, ... ETC
       (1 / SELECT a.vcount 
            FROM (SELECT vm2.visit_id, count(*) AS vcount 
                  FROM dbo.visitmanifests AS vm2 
                  WHERE vm2.inactive = 0 AND vm2.visit_id = vm.Visit_ID 
                  GROUP BY vm2.visit_id) AS a)) AS [No of Visits],
       COL xyz
FROM etc etc

অবশ্যই আপনাকে আপনার প্রদর্শনের প্রয়োজনীয়তা অনুসারে ফলাফলটি ফর্ম্যাট করতে হবে।


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