Select SUM - а что делать, если запрос пустой, а нужен НОЛЬ

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Select SUM - а что делать, если запрос пустой, а нужен НОЛЬ

Сообщение Solo » 28 дек 2005, 03:30

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

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Re: Select SUM - а что делать, если запрос пустой, а нужен Н

Сообщение Klyk » 28 дек 2005, 04:15

Хочешь сделать из "ничего" НОЛЬ? :)
Сделай процедуру вроде

Код: Выделить всё

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

Dmitry Kurbsky
Сообщения: 4
Зарегистрирован: 02 фев 2005, 10:52

Сообщение Dmitry Kurbsky » 28 дек 2005, 08:29

А зачем процедуру-то? Просто coalesce(sum(...),0)

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 28 дек 2005, 11:00

Dmitry Kurbsky писал(а):А зачем процедуру-то? Просто coalesce(sum(...),0)
Попробуй сначала, да ?
А потом иди почитай про то, как работают аггрегаты

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 28 дек 2005, 23:31

AlexandrS писал(а):уж если хотите 0, то пишите:
sum(coalesce(...,0))
хрен редьки не слаще

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Сообщение Klyk » 28 дек 2005, 23:31

попробовал...
только при том условии о котором говорил афтор ("если по этому условию нет записей") всё равно результат null

Dmitry Kurbsky
Сообщения: 4
Зарегистрирован: 02 фев 2005, 10:52

Сообщение Dmitry Kurbsky » 29 дек 2005, 10:55

hvlad писал(а):
Dmitry Kurbsky писал(а):А зачем процедуру-то? Просто coalesce(sum(...),0)
Попробуй сначала, да ?
А потом иди почитай про то, как работают аггрегаты
Попробовал. Получил 0 (не Null). Попробовал внимательно:

Код: Выделить всё

create table test1 (test2 integer)
insert into test1 (test2) values (1)
select test2 from test1
Возвращает, естественно, набор из одной строки и одного столбца со значением 1.

Код: Выделить всё

select test2 from test1 where 1=0
Возвращает (тоже естественно) пустой набор данных (0 строк).

Код: Выделить всё

select sum(test2) from test1
Возвращает (опять естественно) 1 строку со значением 1.

Код: Выделить всё

select sum(test2) from test1 where 1=0
Возвращает 1 строку со значением null.

Код: Выделить всё

select coalesce(sum(test2),0) from test1 where 1=0
Возвращает 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 работают как-то по-другому?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 дек 2005, 11:27

все ты делаешь так, только никак понять не можешь, что существует несколько случаев:

1. когда записи для sum есть, и столбец не null - возвращается результат агрегата (sum)
2. когда записи для sum есть, и столбец null - возвращается 0
3. когда записей для sum нет, возвращается NULL

то есть, тебе сервер конкретно сообщает обо всех трех разных случаях.
Если записей не обработано агрегатом вообще ни одной, почему должен возвращаться 0? Это для Count да, возвращается 0, потому что тут конкретно было 0 записей. А sum - это сумма. Если НИЧЕГО не посчитано, то получаем null.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 29 дек 2005, 12:12

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


Dmitry Kurbsky
Сообщения: 4
Зарегистрирован: 02 фев 2005, 10:52

Сообщение Dmitry Kurbsky » 29 дек 2005, 13:23

kdv писал(а):все ты делаешь так, только никак понять не можешь, что существует несколько случаев:

1. когда записи для sum есть, и столбец не null - возвращается результат агрегата (sum)
2. когда записи для sum есть, и столбец null - возвращается 0
3. когда записей для sum нет, возвращается NULL

то есть, тебе сервер конкретно сообщает обо всех трех разных случаях.
Если записей не обработано агрегатом вообще ни одной, почему должен возвращаться 0? Это для Count да, возвращается 0, потому что тут конкретно было 0 записей. А sum - это сумма. Если НИЧЕГО не посчитано, то получаем null.
Так и я про то же. В третьем случае возвращается null, а применение coalesce(sum(...),0) позволяет вместо этого null получить-таки 0. Что и требовалось автору.

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 30 дек 2005, 05:09

Спасибо всем, кто подсказал, до этого я про эту коалеску и не слыхивал :-)))

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

Всех с новым го-о-одом ! :roll:

Ответить