यदि कोई मान नहीं मिलता है, तो मुझे '0' वापस करने के लिए MySQL में SUM फ़ंक्शन कैसे मिलेगा?


150

कहो कि मेरा MySQL में एक सरल कार्य है:

SELECT SUM(Column_1)
FROM Table
WHERE Column_2 = 'Test'

यदि Column_2 में कोई प्रविष्टियाँ नहीं होती हैं तो पाठ 'टेस्ट' होता है, तो यह फ़ंक्शन लौटता है NULL, जबकि मैं चाहूंगा कि यह 0 पर लौटे।

मुझे पता है कि इसी तरह का प्रश्न यहाँ कुछ बार पूछा गया है, लेकिन मैं अपने उद्देश्यों के उत्तर नहीं दे पाया हूँ, इसलिए मैं इस सहायता के लिए आभारी रहूँगा।


जवाबों:


305

COALESCEउस परिणाम से बचने के लिए उपयोग करें ।

SELECT COALESCE(SUM(column),0)
FROM   table
WHERE  ...

इसे एक्शन में देखने के लिए, कृपया इस sql fiddle को देखें: http://www.sqlfiddle.com/#/2/d1542/3 »


अधिक जानकारी:

तीन तालिकाओं (सभी नंबरों के साथ एक, सभी नल के साथ एक और एक मिश्रण के साथ) को देखते हुए:

एसक्यूएल फिडल

MySQL 5.5.32 स्कीमा सेटअप :

CREATE TABLE foo
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO foo (val) VALUES
(null),(1),(null),(2),(null),(3),(null),(4),(null),(5),(null),(6),(null);

CREATE TABLE bar
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO bar (val) VALUES
(1),(2),(3),(4),(5),(6);

CREATE TABLE baz
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO baz (val) VALUES
(null),(null),(null),(null),(null),(null);

प्रश्न 1 :

SELECT  'foo'                   as table_name,
        'mixed null/non-null'   as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    foo
UNION ALL

SELECT  'bar'                   as table_name,
        'all non-null'          as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    bar
UNION ALL

SELECT  'baz'                   as table_name,
        'all null'              as description,
        0                       as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    baz

परिणाम :

| TABLE_NAME |         DESCRIPTION | EXPECTED_SUM | ACTUAL_SUM |
|------------|---------------------|--------------|------------|
|        foo | mixed null/non-null |           21 |         21 |
|        bar |        all non-null |           21 |         21 |
|        baz |            all null |            0 |          0 |

2
धन्यवाद ब्रैड। यह काम अच्छी तरह से करता है।
निक

1
क्या SUM (IFNULL (कॉलम, 0)) टेबल ग्रुप से कुछ अधिक सही नहीं है? क्या होगा यदि हमारे पास "कॉलम" में कुछ IS NULL मान और कुछ वास्तविक मूल्य हैं?
डार्कसाइड

2
@DarkSide: बिल्कुल अप्रत्याशित कुछ भी नहीं है।
ब्रैड क्रिस्टी

@BradChristie हाँ आप बिलकुल सही कह रहे हैं। NULL मान के साथ भी SUM ठीक काम करता है।
डार्कसाइड

1
कृपया ध्यान रखें कि SUMइच्छानुसार कार्य करते समय , AVGऔर अपने इच्छित परिणाम के आधार पर @DarkSide द्वारा सुझाए गए के रूप में उपयोग करने के लिए आपको प्राप्त करते समय विभिन्न परिणाम उत्पन्नCOUNT कर सकते हैंNULLCOALESCE
17

65

उपयोग IFNULLया COALESCE:

SELECT IFNULL(SUM(Column1), 0) AS total FROM...

SELECT COALESCE(SUM(Column1), 0) AS total FROM...

उनके बीच का अंतर यह है कि IFNULLएक MySQL एक्सटेंशन है जो दो तर्क लेता है, और COALESCEएक मानक SQL फ़ंक्शन है जो एक या अधिक तर्क ले सकता है। जब आपके पास केवल दो तर्कों का उपयोग IFNULLकरना होता है, तो यह थोड़ा तेज होता है, हालांकि यहां अंतर महत्वहीन है क्योंकि यह केवल एक बार कहा जाता है।


3
@ मर्क क्या अंतर बी / डब्ल्यू IFNULLया COALESCE?? क्या आप इसे समझा सकते हैं ??
मो सीन

1
पुनश्च। Postgres के साथ काम करने वाले किसी भी व्यक्ति के लिए, यह केवल समर्थन करता है coalesce
सिद्धार्थ

4

वास्तव में आप जो पूछ रहे हैं वह नहीं मिल सकता है लेकिन यदि आप एक समग्र SUM फ़ंक्शन का उपयोग कर रहे हैं जिसका अर्थ है कि आप तालिका को समूहीकृत कर रहे हैं।

क्वेरी इस तरह MYSQL के लिए चला जाता है

Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition

आप शर्त के आधार पर समूह बनाते हैं, लेकिन इसे वापस नहीं करते हैं (आपको अज्ञात परिस्थितियों का एक गुच्छा मिलेगा)?
लुलिस मार्टिनेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.