Sql सर्वर एक COUNTIF कुल कार्य के बराबर है


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()रेखा स्पष्ट रूप से विफल रहता है के बाद से वहाँ कोई मूल एसक्यूएल समारोह कहा जाता है COUNTIF, लेकिन यह विचार यहां सभी पंक्तियों MyColumn के लिए मूल्य '1' है कि का प्रतिशत निर्धारित करने के लिए है।

MS SQL 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
(मुझे पता है कि ओपी ने एमएस एसक्यूएल के बारे में पूछा था, लेकिन SQLite उपयोगकर्ताओं के लिए बस एक छोटी सी टिप्पणी एक ही काम कर रही है) SQLite नहीं है ISNULL, इसके बजाय आप कर सकते हैं CASE WHEN myColumn IS NULL, या उपयोग कर सकते हैं ifnull( stackoverflow.com/a/799406/1861346 )
मैट

54

मैं आमतौर पर जोश की सिफारिश करता हूं, लेकिन बुद्धिशीलता और थोड़ा होके विकल्प का परीक्षण किया जो मुझे साझा करने जैसा लगा।

आप इस तथ्य का लाभ उठा सकते हैं कि COUNT (ColumnName) NULLs की गणना नहीं करता है, और कुछ इस तरह का उपयोग करता है:

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

NULLIF - NULL लौटाता है यदि दोनों मानों में पास हुए हैं।

लाभ: SUM () अंकन के बजाय COUNT पंक्तियों के लिए अपना इरादा व्यक्त करता है। नुकसान: यह स्पष्ट नहीं है कि यह कैसे काम कर रहा है ("जादू" आमतौर पर खराब होता है)।


2
यह समाधान उस राशि की तुलना में एक अलग उत्तर दे सकता है जब एक समूह में केवल 0. के बजाय 1 में परिणाम होता है
किमव्लिंडे

पुरानी पोस्ट, लेकिन धन्यवाद इससे मदद मिली। मैंने जादू को बढ़ाया और ISNULLनिम्नानुसार "केवल नल" समस्या के आसपास मिला SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0))):। रुको, कि बस बदसूरत लग रहा है ...
pcdev

1
अगर NULLIFNOT फंक्शन था
qwertzguy

21

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

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

2
क्रिस का जवाब NULLIFस्टैंडर्ड एसक्यूएल कंप्लेंट (संकेत: मानक एसक्यूएल -92 शामिल है)। जोश के जवाब आसानी से बदल कर मानक SQL के रूप में तब्दील किया जा सकता है isnullके साथ COALESCE
onedaywhen

मुझे वास्तव में यह उत्तर सबसे अच्छा लगता है, क्योंकि इसमें "गिनती पंक्तियों" का विचार मिलता है जो क्रिस दिखा रहा था, लेकिन अधिक एक्स्टेंसिबल है, क्योंकि आप किसी भी तुलना ऑपरेटर का उपयोग कर सकते हैं; बस नहीं =। मैं इसका उपयोग "प्रतिक्रियाओं की संख्या> = 2" के लिए कर रहा हूं।
क्रिस्टन हैमैक

3

जोश के जवाब में जोड़ना,

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

मेरे लिए (SQL Server 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

उत्पाद-विशिष्ट नहीं, लेकिन SQL मानक प्रदान करता है

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

इस काम के लिए। या ऐसा कुछ जो बारीकी से मिलता-जुलता है, मुझे अपनी टोपी के ऊपर का पता नहीं है।

और निश्चित रूप से विक्रेता अपने मालिकाना समाधान के साथ रहना पसंद करेंगे।


1
मैंने इसके बारे में पहले कभी नहीं सुना था, इसलिए मैंने इसे देखा। आधुनिक-sql.com/feature/filter के अनुसार एकमात्र प्रमुख DBMS है जो वास्तव में FILTERक्लॉज पोस्टग्रेक्यूएल प्रदान करता है, लेकिन यह CASEउन सभी द्वारा अनुकरण किया जाता है।
क्रिस्टन हैमैक

1

ऐसा क्यों नहीं?

SELECT count(1)
FROM AD_CurrentView
WHERE myColumn=1

1
क्योंकि उसे सिर्फ गिनती के अलावा भी बहुत कुछ चाहिए। वह एक समूह के एक हिस्से की पंक्तिबद्ध होने की कोशिश कर रहा है, और फिर पूरे समूह का एक समूह, जो आप एक WHERE के साथ नहीं कर सकते।
क्रिस्टन हैमैक

1

मुझे अपने मामले में COUNTIF () का उपयोग अपने सेलेक्ट कॉलम के हिस्से के रूप में करना था और प्रत्येक आइटम के मेरे परिणामों में दिखाई देने वाली संख्या का एक% की नकल करना था।

इसलिए मैंने इसका इस्तेमाल किया ...

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

बेशक आपको अपनी प्रदर्शन आवश्यकताओं के अनुसार परिणाम को प्रारूपित करने की आवश्यकता होगी।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.