Запрос SQL для возврата NULL для SUM (выражение) всякий раз, когда включенное значение равно NULL - PullRequest
4 голосов
/ 15 марта 2011

Для MySQL я хочу запрос, который возвращает SUM выражения, за исключением того, что я хочу, чтобы возвращаемое значение было NULL, если любое из выражений, включенных в SUM, равно NULL. (Обычная операция SUM - игнорировать значения NULL.

Вот простой тестовый пример, который иллюстрирует

CREATE TABLE t4 (fee VARCHAR(3), fi INT);
INSERT INTO t4 VALUES ('fo',10),('fo',200),('fo',NULL),('fum',400);

SELECT fee, SUM(fi) AS sum_fi FROM t4 GROUP BY fee

Это возвращает именно тот результат, который я ожидаю:

fee sum_fi
--- ------
fo     210
fum    400

Мне нужен запрос, который возвращает РАЗНЫЙ набор результатов:

fee sum_fi
--- ------
fo    NULL
fum    400

Я хочу, чтобы значение, возвращаемое для sum_fi, было равно NULL, если включенное значение равно NULL. (Это отличается от агрегатной функции SUM, которая игнорирует NULL и возвращает сумму для выражений, отличных от NULL.)

Вопрос: Какой запрос я могу использовать для возврата желаемого набора результатов?

Я не нашел ни одной встроенной агрегатной функции, которая бы демонстрировала такое поведение.

Ответы [ 2 ]

13 голосов
/ 15 марта 2011

Как насчет использования SUM(fi is NULL), чтобы определить, есть ли у вас значение NULL в вашем наборе данных? Это должно работать:

SELECT fee, IF(SUM(fi is NULL), NULL, SUM(fi)) AS sum_fi FROM t4 GROUP BY fee
2 голосов
/ 15 марта 2011

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

SELECT fee, 
       IF(COUNT(fi) < (SELECT count(fee) FROM t4 temp2 WHERE temp1.fee = temp2.fee),
           NULL, SUM(fi)) AS sum_fi
FROM t4 temp1 GROUP BY fee

Существует также это решение:

SELECT fee, CASE WHEN COUNT(*) = COUNT(fi) THEN SUM(fi) ELSE NULL END AS sum_fi
FROM t4 GROUP BY fee

, которое я получил из ответа на вопрос Aaron W, помеченный как дубликат этого,Правда, последняя форма выглядит лучше, чем моя первоначальная идея.

...