У меня есть этот запрос
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 в приведенном выше случае.
Вы можете использовать, если для этого:
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'
Я думаю, что я бы назвал ваш запрос следующим:
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;
Здесь моя попытка:
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()
учитывает только ненулевые значения.
cost
и эти затраты также будут иметь нулевые значения. Операция должна быть выполнена с результирующим набором подзапроса, а не внутри подзапроса. Я надеюсь, что я объяснил ясно.
table1
?