А можно ли так в Firebird?

Модераторы: kdv, CyberMax

Ответить
Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

А можно ли так в Firebird?

Сообщение Pavel_ch » 20 авг 2008, 16:39

Доброго времени суток
На клиенте формируется кросс-таб, запрос естественно тоже формируется на клиенте. Мне нужны суммы по услугам и итоговая колонка в конце с общей суммой.
Вот фрагмент сгенерированного на клиенте запроса:

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

select a.abon_name, a.id as abon_id, c.id as contr_id, c.contract_no, c.contract_date ,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 1) and (pp.pay_date between :date_start and :date_end))) as sum_1,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 2) and (pp.pay_date between :date_start and :date_end))) as sum_2,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 3) and (pp.pay_date between :date_start and :date_end))) as sum_3,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 4) and (pp.pay_date between :date_start and :date_end))) as sum_4,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 5) and (pp.pay_date between :date_start and :date_end))) as sum_5,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 22) and (pp.pay_date between :date_start and :date_end))) as sum_22,
(select sum(pp.pay_sum) from payments pp where ((pp.contract_id = c.id) and (pp.service_id = 24) and (pp.pay_date between :date_start and :date_end))) as sum_24,
sum_1+sum_2+sum_3+sum_4+sum_5+sum_22+sum_24 as ITOG
from .....
т.е. для результата каждого подзапроса даётся псевдоним в конце в виде sum_<ID услуги>. А потом мне надо итоговую сумму по договору получить и в самой последней строке я попытался это реализовать, но FB ругается, что поле SUM_1 не найдено.
Это я что-то не так сделал или FB 2.1 так не умеет?

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

Сообщение kdv » 20 авг 2008, 16:42

или FB 2.1 так не умеет
по-моему, никто так не умеет. хотя все может быть.
думаю, что итоговую сумму на клиенте посчитать не составит труда.

Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Сообщение Pavel_ch » 20 авг 2008, 16:46

Спасибо.
Будем думать на клиенте

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 20 авг 2008, 21:49

SELECT FROM SELECT спасёт отца русской демократии.
Т.е. всю байду считаешь во вложенном, а снаружи уже можешь суммами оперировать.

И кстати я бы построитель на CASE пределал.

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

select sum(case when pp.service_id = 1 then pp.pay_sum end) sum_1,
       sum(case when pp.service_id = 2 then pp.pay_sum end) sum_2,
       ...
       sum(case when pp.service_id = 24 then pp.pay_sum end) sum_24,
       sum(case when pp.service_id in (1, 2, ..., 24) then pp.pay_sum end) ITOG
  from c
       left join payments pp on pp.contract_id = c.id and pp.pay_date between :date_start and :date_end
  group by c.id -- ну или чё там у тебя

Ответить