source

레코드가 없는 경우 sum -or - 0을 선택하는 방법은 무엇입니까?

gigabyte 2022. 9. 4. 15:27
반응형

레코드가 없는 경우 sum -or - 0을 선택하는 방법은 무엇입니까?

특정 기준을 충족하는 모든 값의 합계를 반환하는 쿼리를 작성해야 하지만 행을 찾을 수 없으면 null이 아닌 0을 반환해야 합니다.예를 들어 다음과 같습니다.

tab    
+---------------+-----+
| descr         | num |
+---------------+-----+
| hello there   | 5   |
| hi there      | 10  |
| hello         | 10  |
| hi there!     | 15  |
+---------------+-----+

다음 쿼리:

SELECT sum(num) AS val FROM tab WHERE descr LIKE "%hello%";

돌아와야 한다, 돌아와야 한다.15단,

SELECT sum(num) AS val FROM tab WHERE descr LIKE "%greetings%";

돌아와야 한다0단, 반환됩니다.null.

이게 가능한지 누가 설명 좀 해줄래?

그럼 어떻게 해?

SELECT COALESCE(sum(num), 0) AS val FROM tab WHERE descr LIKE "%greetings%";

COALESCE 함수는 기본적으로 "null이 아닌 한 첫 번째 파라미터를 반환한다"고 말합니다.이 경우 두 번째 파라미터를 반환하는 것은 매우 편리합니다.

MySQL 문서에서 IFNULL을 확인합니다.

SELECT SUM(IFNULL(num, 0)) as val FROM tab WHERE descr LIKE "%greetings%";

물론, 이것은 당신의num필드는 null이며 기본값은 없습니다.다른 생각할 수 있는 해결책은 디폴트를 설정하는 것입니다.0num 필드에 입력함으로써 문제가 해결됩니다.

이 작업을 올바르게 수행하려면 실제로 존재하는 경우를 구분할 수 있습니다.NULL합산할 데이터가 생성되고 합산할 값이 전혀 없는 경우가 발생합니다.

예를 들어 다음과 같습니다.

mysql> select * from t;
+----------+------+
| descr    | num  |
+----------+------+
| hiya     |    5 |
| hi there |   10 |
| yo       | NULL |
+----------+------+

빈 금액은 0이길 바라지만, 그 합계는NULL되려고NULL그렇게 하는 한 가지 방법은 다음과 같습니다.

mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
    ->    SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
    ->    FROM t WHERE num < 'ciao')
    -> AS u;
+------+
| sum  |
+------+
|    0 |
+------+
1 row in set, 1 warning (0.00 sec)

mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
    ->    SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
    ->    FROM t)
    -> AS u;
+------+
| sum  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
    ->    SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
    ->    FROM t WHERE descr < 'namaste')
    -> AS u;
+------+
| sum  |
+------+
|   15 |
+------+
1 row in set (0.00 sec)

mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
    ->    SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
    ->    FROM t WHERE descr > 'namaste')
    -> AS u;
+------+
| sum  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

아마 내가 미처 생각하지 못한 더 좋은 방법이 있을 거야.

안타깝게도 요소가 합산되지 않은 경우 SQL 표준은 null로 정의되며 MySQL은 이 표준을 따를 수밖에 없습니다.

이 방법은 다음과 같습니다.

SELECT IF(SUM(num) IS NULL, 0, SUM(num)) AS val FROM tab WHERE descr LIKE "%whatever%";

IF()는 (1) 스테이트먼트, (2) 스테이트먼트가 참일 경우 적용할 값, (3) 스테이트먼트가 거짓일 경우 적용할 값의 3가지 파라미터를 취합니다.

간단한 방법은 다음과 같습니다.

SELECT IFNULL(SUM(num), 0) as val FROM tab WHERE descr LIKE "%greetings%";

언급URL : https://stackoverflow.com/questions/8888390/how-to-select-sum-or-0-if-no-records-exist

반응형