क्या काउंट () में स्थिति निर्दिष्ट करना संभव है?


391

क्या इसमें एक शर्त निर्दिष्ट करना संभव है Count()? मैं केवल उन पंक्तियों को गिनना चाहता हूं, जिनके लिए स्थिति कॉलम में "प्रबंधक" है।

मैं इसका उपयोग नहीं करते हुए, गिनती के बयान में करना चाहता हूं WHERE; मैं इसके बारे में पूछ रहा हूँ क्योंकि मैं एक ही में दोनों प्रबंधकों और अन्य गिनती करने की आवश्यकता है SELECT(कुछ की तरह Count(Position = Manager), Count(Position = Other))तो WHEREइस उदाहरण में मेरे लिए कोई फायदा नहीं है।


4
सभी * उपयोगकर्ताओं को बू, काउंट (SomeColumnInYourTable) का उपयोग करें जहां पद = 'प्रबंधक'
मार्क डिकिंसन

6
@ मर्क: सभी आधुनिक डेटाबेस पर, इससे कोई फर्क नहीं पड़ता।
फिलिप लोएबार्ट

4
@ मर्क और फिलिप: वास्तव में यह एक महान अंतर बना सकता है। यदि फ़ील्ड अशक्त है और अनुक्रमित नहीं है, तो क्वेरी को तालिका में प्रत्येक रिकॉर्ड को छूने की आवश्यकता है, इसलिए गणना (*) और गणना (फ़ील्ड) का उपयोग करके अलग-अलग परिणाम और विभिन्न प्रदर्शन दे सकते हैं।
गुफ़ा

3
मैंने वर्षों के लिए गणना (*) बनाम गिनती (x) के लिए निष्पादन योजनाओं का विश्लेषण किया है, और अब तक मुझे एक भी ऐसा नहीं मिला है जो प्रदर्शन में अंतर दिखाता हो। इसलिए मैं वास्तव में एक क्वेरी का एक उदाहरण देखना चाहता हूं जहां अंतर है।
फिलिप लेबेर्ट 14

2
@ मैथ्यू: हम बात नहीं कर रहे हैं SELECT *, लेकिन SELECT COUNT(*), जो एक बिल्कुल अलग जानवर है।
फिलिप लेबेर्ट 14

जवाबों:


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 ...

क्या होगा यदि मेरा क्षेत्र पूर्णांक है और मैं अशक्त मेल करना चाहता हूं। यह इस तरह से काम नहीं करता है गिनती का चयन करें (मामला IntegerField जब 'NULL' तब 1 और शून्य अंत) से
Faizan

2
@ फैजान nullखास है। उपयोगcase when IntegerField is null then ...
Peet Brits

बूलियन फ़ील्ड्स के साथ काम करते समय आप इसका उपयोग कर सकते हैं: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क्योंकि यह केस स्टेटमेंट के परिणामों को बेहतर ढंग से दर्ज करता है, विशेष रूप से novie SQL डेवलपर्स के लिए। संक्षिप्तता के लिए, इसे इस मामले में हटाया जा सकता है।
RedFilter

30

@ Guffa का उत्तर उत्कृष्ट है, बस यह इंगित करें कि शायद IF कथन के साथ क्लीनर है

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

यदि आप SQL 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
संपादित से पता चलता है कि वह पंक्तियों को जहां एक खंड के साथ प्रतिबंधित नहीं करना चाहते हैं
KinSlayerUY

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
आपको एक डाउनवोट मिलता है क्योंकि प्रश्न "काउंट में कंडीशन निर्दिष्ट करें" नहीं "कंडीशन द्वारा काउंट वैल्यूज़" है। तो आप गलत सवाल का जवाब दे रहे हैं
Radon8472

3
उत्तर को नीचा दिखाने के लिए यह थोड़ा अनुचित था, जब उत्तर लिखा गया तो यह प्रश्न का एक सही समाधान था .... उन्होंने इस उत्तर के 4 मिनट बाद अतिरिक्त पाठ जोड़ा!
पीटर

2

यहां मैंने एक डेटा सेट प्राप्त करने के लिए किया जिसमें कुल और संख्या दोनों शामिल थे जो मानदंडों को पूरा करते थे, प्रत्येक शिपिंग कंटेनर के भीतर। मुझे इस सवाल का जवाब दो "कितने शिपिंग कंटेनरों का आकार 51% से अधिक X% है"

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


-4

इसका उपयोग करके आप प्रबंधकों के लिए गिनती प्राप्त करेंगे

Select Position, count(*) as 'Position Counter'
from your_table 
group by Position 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.