Нужна помощь по запросу

WEvgenij
Дата: 12.10.2005 12:21:32
Раньше стоял Yaffil и был вот такой запрос:
select
  d.name,
  bm.fio_all,
  o.name,
  sum(s.summa) allsumma,
  (
    select
      iif(sum(ss.summa)>0,sum(ss.summa),0)
    from salaryr ss
    left join bdcode bcc on (bcc.id_code = ss.id_code)
    where
      (ss.yearrem = 2005) and
      ((ss.monthrem > 3) and (ss.monthrem < 7))  and
      (ss.id_kadr = s.id_kadr) and
      (bcc.name_code in (112,113))
  ) otpusk,
  sum(iif(bc.name_code in (152),s.summa,0)) premij
from salaryr s
left join bdcode bc on (bc.id_code = s.id_code)
left join data_work dw on (dw.id_datawork = s.id_datawork)
left join office o on (o.codedol = dw.codedol)
left join bdkadr_m bm on (bm.id_kadr = s.id_kadr)
left join depat d on (d.id_dep = dw.id_dep)
where
  (s.year_sis = 2005) and
  ((s.month_sis > 3) and (s.month_sis < 7))  and
  (bc.name_code in (101,103,104,105,107,108,115,118,119,126,133,137,141,142,143,145,146,
                    149,154,152,155,156,157,158,159,162,165,166,173,136,172,171))
group by
  d.name,
  bm.fio_all,
  o.name
Щас стоит Firebird 1.5 и я его стал переделывать с использованием case:
select
  d.name,
  bm.fio_all,
  o.name,
  sum(s.summa) allsumma,
  (
    select
      sum(case
            when (ss.summa>0) then ss.summa
            else 0
          end
      )
    from salaryr ss
    left join bdcode bcc on (bcc.id_code = ss.id_code)
    where
      (ss.yearrem = 2005) and
      ((ss.monthrem > 3) and (ss.monthrem < 7))  and
      (ss.id_kadr = s.id_kadr) and
      (bcc.name_code in (112,113))
  ) otpusk,
  sum(case
        when (bc.name_code in (152)) then s.summa
        else 0
      end
  ) premij
from salaryr s
left join bdcode bc on (bc.id_code = s.id_code)
left join data_work dw on (dw.id_datawork = s.id_datawork)
left join office o on (o.codedol = dw.codedol)
left join bdkadr_m bm on (bm.id_kadr = s.id_kadr)
left join depat d on (d.id_dep = dw.id_dep)
where
  (s.year_sis = 2005) and
  ((s.month_sis > 3) and (s.month_sis < 7))  and
  (bc.name_code in (101,103,104,105,107,108,115,118,119,126,133,137,141,142,143,145,146,
                    149,154,152,155,156,157,158,159,162,165,166,173,136,172,171))
group by
  d.name,
  bm.fio_all,
  o.name
Выдает ошибку:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

Ошибка именно на столбец otpusk, без него работает. Как я понимаю, нужно чтоб он выдавал одну строку. Я попробывал заменить на вот такое:
  sum(
    select
      sum(case
            when (ss.summa>0) then ss.summa
            else 0
          end
      )
    from salaryr ss
    left join bdcode bcc on (bcc.id_code = ss.id_code)
    where
      (ss.yearrem = 2005) and
      ((ss.monthrem > 3) and (ss.monthrem < 7))  and
      (ss.id_kadr = s.id_kadr) and
      (bcc.name_code in (112,113))
  ) otpusk,
Тогда появляеться ошибка:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 7, char 5.
select.
Ругаеться на select.

Помогите как правильно произвести замену iif.
Зарание всем спасибо.
Kull Damned
Дата: 12.10.2005 12:23:40
Вроде в двойке IIF добавился...

Posted via ActualForum NNTP Server 1.3

Карабас Барабас
Дата: 12.10.2005 12:24:40
Вроде надо SUM в скобочки взять
WEvgenij
Дата: 12.10.2005 12:25:07
Мы пока двойку ставить не можем, токо 1.5
Карабас Барабас
Дата: 12.10.2005 12:25:10
т.е. sum((select ....))

Posted via ActualForum NNTP Server 1.3

WEvgenij
Дата: 12.10.2005 12:26:46
Сенкс, заработало, правда не быстро считает, може можно как то тот запрос оптимизировать. Но всеравно спасибо
WEvgenij
Дата: 12.10.2005 12:52:32
Не правильно стала считать, раньше она брала один раз значение otpusk, а теперь скока строк перед группировкой получается, стоко раз она одну и туже сумму складывает.
WEvgenij
Дата: 12.10.2005 13:00:15
Выход пока нашол токо один, добавив столбик:
count(s.id_salaryr) cnt

а потом буду делить otpusk / cnt
kdv
Дата: 12.10.2005 13:05:45
я не совсем понял, что за таблица salaryr - это выдача зарплаты или что-то вроде? Тогда почему она стоит как left join ???

где то уже я этот запрос видел. Особенно умиляют конструкции
select ...
from a LEFT JOIN b on a.id = b.id
where b in (1, 2, 3)...

бред сивой кобылы, извините меня, никого не имел в виду персонально :-)
kdv
Дата: 12.10.2005 13:06:46
хотя, сам же учил так делать, но осмысленно. :-)
поэтому вопрос трансформируется в - в данной конструкции left join используется осознанно, или наобум? :-)