Làm cách nào để tôi có được hàm SUM trong MySQL để trả về '0' nếu không tìm thấy giá trị nào?


150

Nói rằng tôi có một chức năng đơn giản trong MySQL:

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

Nếu không có mục nào trong Column_2 chứa văn bản 'Kiểm tra' thì hàm này sẽ trả về NULL, trong khi tôi muốn nó trả về 0.

Tôi biết rằng một câu hỏi tương tự đã được hỏi một vài lần ở đây, nhưng tôi không thể điều chỉnh câu trả lời cho mục đích của mình, vì vậy tôi rất biết ơn sự giúp đỡ để sắp xếp câu hỏi này.


có thể trùng lặp Trợ giúp với MySQL SUM ()
JohnFx

Câu trả lời:


305

Sử dụng COALESCEđể tránh kết quả đó.

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

Để xem nó hoạt động, xin vui lòng xem fiddle sql này: http://www.sqlfiddle.com/#!2/d1542/3/0


Thêm thông tin:

Cho ba bảng (một bảng có tất cả các số, một bảng có tất cả các giá trị null và một bảng có hỗn hợp):

Câu đố SQL

Thiết lập lược đồ 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);

Truy vấn 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

Kết quả :

| 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
Cảm ơn Brad. Đó là công việc độc đáo.
Nick

1
Không phải CHỌN SUM (IFNULL (cột, 0)) TỪ bảng NHÓM B BYNG điều gì đó đúng hơn? Điều gì xảy ra nếu chúng ta có một số giá trị IS NULL và một số giá trị thực trong "cột"?
DarkSide

2
@DarkSide: Hoàn toàn không có gì bất ngờ.
Brad Christie

@BradChristie vâng, bạn hoàn toàn đúng. SUM cũng hoạt động tốt với các giá trị NULL.
DarkSide

1
Xin lưu ý rằng mặc SUMdù hoạt động như mong muốn AVGCOUNTcó thể tạo ra các kết quả khác nhau khi nhận được NULLNhắc bạn sử dụng COALESCEtheo đề xuất của @DarkSide, tùy thuộc vào kết quả mong muốn của bạn.
fyrye

65

Sử dụng IFNULLhoặc COALESCE:

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

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

Sự khác biệt giữa chúng là IFNULLmột phần mở rộng MySQL có hai đối số và COALESCElà một hàm SQL tiêu chuẩn có thể nhận một hoặc nhiều đối số. Khi bạn chỉ có hai đối số sử dụng IFNULLthì nhanh hơn một chút, mặc dù ở đây sự khác biệt là không đáng kể vì nó chỉ được gọi một lần.


3
@Mark sự khác biệt b / w IFNULLhay COALESCE?? bạn có thể giải thích nó ??
mo sean

1
Tái bút Đối với bất cứ ai làm việc với Postgres, nó chỉ hỗ trợ coalesce.
Siddhartha

4

Không thể có được chính xác những gì bạn đang hỏi nhưng nếu bạn đang sử dụng hàm SUM tổng hợp có nghĩa là bạn đang nhóm bảng.

Truy vấn dành cho MYSQL như thế này

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

Bạn nhóm theo điều kiện nhưng không trả lại (bạn sẽ nhận được một loạt các điều kiện không xác định)?
Lluis Martinez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.