값을 찾지 못하면 MySQL에서 SUM 함수가 어떻게 '0'을 반환합니까?


150

MySQL에 간단한 기능이 있다고 가정 해보십시오.

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

Column_2의 항목에 'Test'라는 텍스트가 포함되어 있지 않으면 이 함수는 NULL을 반환하지만 0을 반환하려고합니다.

나는 비슷한 질문이 여기에서 몇 번 나왔다는 것을 알고 있지만 내 목적에 대한 답변을 조정할 수 없었기 때문에 이것을 분류하는 데 도움을 주셔서 감사합니다.


답변:


305

COALESCE그 결과를 피하기 위해 사용하십시오 .

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

실제로 사용하려면 다음 SQL 바이올린을 참조하십시오. http://www.sqlfiddle.com/#!2/d1542/3/0


추가 정보:

세 개의 테이블이 있습니다 (하나는 모든 숫자, 하나는 모두 널, 하나는 혼합).

SQL 바이올린

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
고마워 브래드 그것은 잘 작동합니다.
Nick

1
GROUP BY 테이블에서 SELECT SUM (IFNULL (column, 0))이 더 잘못된 것입니까? "열"에 IS NULL 값과 실제 값이 있으면 어떻게합니까?
DarkSide

2
@ DarkSide : 예상치 못한 것은 없습니다 .
Brad Christie

@BradChristie 네, 그렇습니다. SUM도 NULL 값으로 잘 작동합니다.
DarkSide

1
동안 양해하여 주시기 바랍니다 SUM기능을 수행 원하는대로 AVG하고 COUNT있습니다 다른 결과를 수신 할 때 NULL사용하라는 COALESCE원하는 결과에 따라, @DarkSide에 의해 제안.
fyrye

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
@ 마크 차이 b / w IFNULL또는 COALESCE?? 설명해 주시겠습니까?
mo sean

1
추신. Postgres를 사용하는 모든 사람은을 지원합니다 coalesce.
Siddhartha

4

원하는 것을 정확히 얻을 수는 없지만 집계 SUM 함수를 사용하는 경우 테이블을 그룹화하고 있음을 의미합니다.

쿼리는 다음과 같이 MYSQL을 사용합니다.

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

조건별로 그룹화하지만 반환하지 않습니다 (알 수없는 조건이 많이 발생합니다)?
Lluis Martinez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.