Функция SUM для возврата нуля, если существует нулевое значение

0

У меня есть этот запрос

SELECT (SELECT cost FROM table1 t2 WHERE t2.edate=>table1.edate) AS cost
FROM table1
WHERE table1.orderNo = 'CS119484568'

приведенный выше запрос возвращает:

cost
4
3
null
null
5

Я хочу получить сумму всех или null, если какая-либо строка имеет значение null

SELECT SUM((SELECT cost FROM table1 t2 WHERE t2.edate=>table1.edate)) AS cost
FROM table1
WHERE table1.orderNo = 'CS119484568'

Ожидаемый результат NULL в приведенном выше случае.

  • 0
    Возможный дубликат MySQL - Sum только если все строки не равны NULL, иначе возвращают NULL
  • 0
    Извините, не могли бы вы объяснить более подробно? Ваши примеры не имеют особого смысла. В первом случае подзапрос, скорее всего, вернет более 1 строки, так что это не может быть правильно. Можете ли вы дать образец данных в table1 ?
Теги:

3 ответа

0

Вы можете использовать, если для этого:

SELECT IF((SELECT COUNT(*) FROM table1 t2 WHERE t2.edate=>table1.edate AND cost IS NULL), null, (SELECT SUM(cost) FROM table1 t2 WHERE t2.edate=>table1.edate)) AS cost FROM table1 WHERE table1.orderNo = 'CS119484568'
  • 0
    Два подзапроса, как вы упомянули, могут решить проблему, но я пытался ее избежать. Посмотрим на это позже. Спасибо
0

Я думаю, что я бы назвал ваш запрос следующим:

SELECT SUM(CASE WHEN t1.edate >= tt1.edate THEN cost END)
FROM table1 t1 CROSS JOIN
     (SELECT edate
      FROM table1
      WHERE t1.orderNo = 'CS119484568'
     ) tt1;

Тогда я бы использовал выражение CASE для вашего результата:

SELECT (CASE WHEN SUM(t1.edate >= tt1.edate AND cost IS NOT NULL) = 0  -- no nulls
             THEN SUM(CASE WHEN t1.edate >= tt1.edate THEN cost END)
        END)
FROM table1 t1 CROSS JOIN
     (SELECT edate
      FROM table1
      WHERE t1.orderNo = 'CS119484568'
     ) tt1;
0

Здесь моя попытка:

SELECT
    (SELECT
        case when count(*)=count(cost) then sum(cost) else null end
     FROM table1 t2
     WHERE t2.edate=>table1.edate
    ) AS cost
FROM table1
WHERE table1.orderNo = 'CS119484568'

Это основано на том факте, что count() учитывает только ненулевые значения.

  • 0
    Он вернул тот же результат, что и мой первый запрос. Подзапрос предназначен для возврата cost и эти затраты также будут иметь нулевые значения. Операция должна быть выполнена с результирующим набором подзапроса, а не внутри подзапроса. Я надеюсь, что я объяснил ясно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню