SQL запрос, как сделать sum () для некоторого поля, но вернуться к 'NA', если одно из них в sum () имеет значение null - PullRequest
0 голосов
/ 12 февраля 2020

Используем mysql. В определенном месте в запросе SQL мне нужно вычислить поле как сумму других значений, но в то же время принять во внимание, что если одно из суммируемых значений имеет значение null, то вычисленное значение это не сумма (), но также и ноль.

(для простоты вопроса я говорю, что значение запасного условия равно нулю, но в любом случае - некоторое фиксированное значение).

Как интегрировать дополнительные резервные условия в функцию sum () в mysql? Пример данных:

id  value  some_fk
1   1      AL
2   3      AL
3   jak    AL
4   7      AL
5   6      AL

, если я их суммирую, например:

select sum(value) from tmp;

, я хочу получить возвращаемое значение «не суммируемо», поскольку существует значение « jak 'в одном из рядов, который не суммируется с другими.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вы ищете IFNULL()?

Пример данных

CREATE TABLE SAMPLE(ID INT, SAL INT);
INSERT INTO SAMPLE VALUES(1,1000);
INSERT INTO SAMPLE VALUES(1,2000);
INSERT INTO SAMPLE VALUES(2,'3000');
INSERT INTO SAMPLE VALUES(2,'1000');
INSERT INTO SAMPLE VALUES(3,NULL);
---------NEW SAMPLE BASED ON COMMENT---------
INSERT INTO SAMPLE VALUES(3,NULL);
INSERT INTO SAMPLE VALUES(3,'MYTEXT');
INSERT INTO SAMPLE VALUES(3,500);
INSERT INTO SAMPLE VALUES(4,'MYTEXT2');
INSERT INTO SAMPLE VALUES(4,'MYTEXT3');
INSERT INTO SAMPLE VALUES(4,10.2);
INSERT INTO SAMPLE VALUES(5,NULL);
INSERT INTO SAMPLE VALUES(5,NULL);

Если я правильно понял, для вышеуказанных данных вы ожидаете результат, как показано ниже.

+----+------------+
| ID | SUM_RESULT |
+----+------------+
| 1  | 3000       |
+----+------------+
| 2  | 4000       |
+----+------------+
| 3  | N/A        |
+----+------------+

В этом случае вы можете использовать

SELECT ID,
       IFNULL(SUM(SAL),'N/A') AS SUM_RESULT 
FROM SAMPLE GROUP BY ID

ПРОВЕРИТЬ ДЕМО ЗДЕСЬ

ОБНОВЛЕНИЕ НА ОСНОВЕ КОММЕНТАРИИ:

Вы можете использовать приведенный ниже запрос, если хотите отобразить сообщение об ошибке, если группа содержит какой-либо текст.

select ID,
       CASE WHEN 
            MAX(CASE WHEN SAL REGEXP ('^[0-9]+$') THEN SAL ELSE 'N/A' END) !='N/A' 
            THEN
                SUM(SAL)
       ELSE 'NOT SUMMABLE' END AS MYRESULT
FROM SAMPLE
GROUP BY ID

OUTPUT

+----+--------------+
| ID |   MYRESULT   |
+----+--------------+
|  1 | 3000         |
|  2 | 4200         |
|  3 | NOT SUMMABLE |
|  4 | NOT SUMMABLE |
|  5 | NOT SUMMABLE |
+----+--------------+

ПРОВЕРЬТЕ ДЕМО ЗДЕСЬ

0 голосов
/ 12 февраля 2020

Вы можете сделать это с помощью этого выражения CASE:

select 
  case 
    when exists (
      select 1 from tmp
      where value is null or concat(value + 0) <> value
    ) then null
    else (select sum(value) from tmp)  
  end result

EXISTS проверяет недопустимые целочисленные значения и значения NULL и возвращает null, если найдет их. Часть ELSE безопасно возвращает сумму. Смотрите упрощенную демоверсию .

...