Select SUM - а что делать, если запрос пустой, а нужен НОЛЬ
Модератор: kdv
Select SUM - а что делать, если запрос пустой, а нужен НОЛЬ
Возможно, я туплю, ну да ладно, нет опыта...
SELECT SUM где какое-то условие.
Так вот, если по этому условию нет записей, Empty то-есть?
Тада IB_Query возвращает пустое место. А если к пустому месту что-нить прибавить - получается тоже пустое место...
Надо, чтобы даже при пустом запросе возвращался НОЛЬ
А Как?
SELECT SUM где какое-то условие.
Так вот, если по этому условию нет записей, Empty то-есть?
Тада IB_Query возвращает пустое место. А если к пустому месту что-нить прибавить - получается тоже пустое место...
Надо, чтобы даже при пустом запросе возвращался НОЛЬ
А Как?
Re: Select SUM - а что делать, если запрос пустой, а нужен Н
Хочешь сделать из "ничего" НОЛЬ? 
Сделай процедуру вроде

Сделай процедуру вроде
Код: Выделить всё
CREATE PROCEDURE MY_PROC
RETURNS (
SUMRESULT INTEGER)
AS
begin
select sum(mytable.Result)
from mytable where
mytable.uid = 2
into :SumResult;
if (SumResult is null) then SumResult = 0 ;
suspend;
end
-
- Сообщения: 4
- Зарегистрирован: 02 фев 2005, 10:52
-
- Сообщения: 4
- Зарегистрирован: 02 фев 2005, 10:52
Попробовал. Получил 0 (не Null). Попробовал внимательно:hvlad писал(а):Попробуй сначала, да ?Dmitry Kurbsky писал(а):А зачем процедуру-то? Просто coalesce(sum(...),0)
А потом иди почитай про то, как работают аггрегаты
Код: Выделить всё
create table test1 (test2 integer)
insert into test1 (test2) values (1)
select test2 from test1
Код: Выделить всё
select test2 from test1 where 1=0
Код: Выделить всё
select sum(test2) from test1
Код: Выделить всё
select sum(test2) from test1 where 1=0
Код: Выделить всё
select coalesce(sum(test2),0) from test1 where 1=0
Прочитал, наконец, Language Reference:
Что я делаю не так?SUM() is an aggregate function that calculates the sum of numeric values for a column. If the number of qualifying rows is zero, SUM() returns a NULL value.
FB 1.5.2
Может быть, другие версии IB/FB работают как-то по-другому?
все ты делаешь так, только никак понять не можешь, что существует несколько случаев:
1. когда записи для sum есть, и столбец не null - возвращается результат агрегата (sum)
2. когда записи для sum есть, и столбец null - возвращается 0
3. когда записей для sum нет, возвращается NULL
то есть, тебе сервер конкретно сообщает обо всех трех разных случаях.
Если записей не обработано агрегатом вообще ни одной, почему должен возвращаться 0? Это для Count да, возвращается 0, потому что тут конкретно было 0 записей. А sum - это сумма. Если НИЧЕГО не посчитано, то получаем null.
1. когда записи для sum есть, и столбец не null - возвращается результат агрегата (sum)
2. когда записи для sum есть, и столбец null - возвращается 0
3. когда записей для sum нет, возвращается NULL
то есть, тебе сервер конкретно сообщает обо всех трех разных случаях.
Если записей не обработано агрегатом вообще ни одной, почему должен возвращаться 0? Это для Count да, возвращается 0, потому что тут конкретно было 0 записей. А sum - это сумма. Если НИЧЕГО не посчитано, то получаем null.
Малость неточно. Есть вариации.kdv писал(а): 3. когда записей для sum нет, возвращается NULL
Код: Выделить всё
select * from classes where code=-2
select sum(code) from classes where code=-2
SUM
===========
<null>
select sum(code) from classes where code=-2
group by code
-
- Сообщения: 4
- Зарегистрирован: 02 фев 2005, 10:52
Так и я про то же. В третьем случае возвращается null, а применение coalesce(sum(...),0) позволяет вместо этого null получить-таки 0. Что и требовалось автору.kdv писал(а):все ты делаешь так, только никак понять не можешь, что существует несколько случаев:
1. когда записи для sum есть, и столбец не null - возвращается результат агрегата (sum)
2. когда записи для sum есть, и столбец null - возвращается 0
3. когда записей для sum нет, возвращается NULL
то есть, тебе сервер конкретно сообщает обо всех трех разных случаях.
Если записей не обработано агрегатом вообще ни одной, почему должен возвращаться 0? Это для Count да, возвращается 0, потому что тут конкретно было 0 записей. А sum - это сумма. Если НИЧЕГО не посчитано, то получаем null.
Спасибо всем, кто подсказал, до этого я про эту коалеску и не слыхивал
))
Залез в релизнотес 1,5 , там сказано примерно то же, что и говорили Дмитрий Курбский и АлександрС. Я уже сделал, все получилось, при пустом запросе выводит 0,000, что и требовалось. Уже обновил экзешник и унес клиенту.
Всех с новым го-о-одом !

Залез в релизнотес 1,5 , там сказано примерно то же, что и говорили Дмитрий Курбский и АлександрС. Я уже сделал, все получилось, при пустом запросе выводит 0,000, что и требовалось. Уже обновил экзешник и унес клиенту.
Всех с новым го-о-одом !
