Bagaimana cara mendapatkan fungsi SUM di MySQL untuk mengembalikan '0' jika tidak ada nilai yang ditemukan?


150

Katakanlah saya memiliki fungsi sederhana di MySQL:

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

Jika tidak ada entri dalam Column_2 berisi teks 'Tes' maka fungsi ini kembali NULL, sementara saya ingin mengembalikan 0.

Saya menyadari bahwa pertanyaan serupa telah diajukan beberapa kali di sini, tetapi saya belum dapat mengadaptasi jawaban untuk tujuan saya, jadi saya akan berterima kasih atas bantuan untuk menyelesaikan masalah ini.


kemungkinan duplikat Bantuan dengan MySQL SUM ()
JohnFx

Jawaban:


305

Gunakan COALESCEuntuk menghindari hasil itu.

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

Untuk melihatnya beraksi, silakan lihat biola sql ini: http://www.sqlfiddle.com/#!2/d1542/3/0


Informasi Lebih Lanjut:

Diberikan tiga tabel (satu dengan semua angka, satu dengan semua nol, dan satu dengan campuran):

SQL Fiddle

Pengaturan Skema 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);

Pertanyaan 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

Hasil :

| 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
Terima kasih Brad. Itu melakukan pekerjaan dengan baik.
Nick

1
Bukankah SELECT SUM (IFNULL (kolom, 0)) DARI tabel GROUP BY sesuatu yang lebih benar? Bagaimana jika kita memiliki beberapa nilai IS NULL dan beberapa nilai nyata di "kolom"?
DarkSide

2
@DarkSide: Sama sekali tidak terduga.
Brad Christie

@BradChristie ya Anda memang benar. SUM bekerja dengan baik dengan nilai NULL juga.
DarkSide

1
Perlu diketahui bahwa sementara SUMberfungsi sesuai keinginan, AVGdan COUNTdapat menghasilkan hasil yang berbeda saat menerima NULLMeminta Anda untuk menggunakan COALESCEseperti yang disarankan oleh @DarkSide, tergantung pada hasil yang Anda inginkan.
fyrye

65

Gunakan IFNULLatau COALESCE:

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

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

Perbedaan di antara mereka adalah bahwa itu IFNULLadalah ekstensi MySQL yang mengambil dua argumen, dan COALESCEmerupakan fungsi SQL standar yang dapat mengambil satu atau lebih argumen. Ketika Anda hanya memiliki dua argumen menggunakan IFNULLsedikit lebih cepat, meskipun di sini perbedaannya tidak signifikan karena hanya dipanggil sekali.


3
@ Mark apa bedanya b / w IFNULLatau COALESCE?? bisakah kamu menjelaskannya ??
mo sean

1
PS. Bagi siapa pun yang bekerja dengan Postgres, itu hanya mendukung coalesce.
Siddhartha

4

Tidak bisa mendapatkan persis apa yang Anda minta tetapi jika Anda menggunakan fungsi SUM agregat yang menyiratkan bahwa Anda mengelompokkan tabel.

Kueri berlaku untuk MYSQL seperti ini

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

Anda dikelompokkan berdasarkan kondisi tetapi tidak mengembalikannya (Anda akan mendapatkan banyak kondisi yang tidak diketahui)?
Lluis Martinez
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.