레코드가 없는 경우 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이며 기본값은 없습니다.다른 생각할 수 있는 해결책은 디폴트를 설정하는 것입니다.0
num 필드에 입력함으로써 문제가 해결됩니다.
이 작업을 올바르게 수행하려면 실제로 존재하는 경우를 구분할 수 있습니다.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
'source' 카테고리의 다른 글
Vue 컴포넌트를 외부 프로젝트에 공개하다 (0) | 2022.09.04 |
---|---|
동일한 표의 다른 열의 데이터와 일치하도록 열을 업데이트하는 방법 (0) | 2022.09.04 |
MySQL - 문자열 길이로 데이터를 선택하는 방법 (0) | 2022.09.04 |
제한, Java ssl 디버깅로깅 (0) | 2022.09.04 |
v-model에서 getter setter를 어떻게 사용합니까? (0) | 2022.09.04 |