Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > [FB]объеденение с union


Автор: Filosov 1.7.2009, 16:52
Есть запрос 
Код

select hdo.org o_kod, org.name o_name, spt.kod p_kod, spt.name p_name, sum(rco.cnt) realiz
from  mn_rc_tov_out rco, mn_hd_tov_out hdo,
      spr_tov spt, spr_org org
where (spt.kod = rco.tov) and
      (rco.doc = hdo.kod) and
      (hdo.ORG = org.kod) and
      (org.grp in (select gr.kod from spr_org_groups gr
                where gr.kod = :grp_list or gr.parentid =:grp_list)) and
      (hdo.DAT = :DAT)
group by hdo.org, org.name, spt.kod, spt.name
union select hdo.org, org.name, spt.kod, spt.name, sum(rco.cnt)
from  mn_rc_tov_reserv  rco, mn_hd_tov_reserv  hdo,
      spr_tov spt, spr_org org
where (spt.kod = rco.tov) and
      (rco.doc = hdo.kod) and
      (hdo.ORG = org.kod) and
      (org.grp in (select gr.kod from spr_org_groups gr
                where gr.kod = :grp_list or gr.parentid =:grp_list)) and
      (hdo.DAT = :DAT)
group by hdo.org, org.name, spt.kod, spt.name

Он выдает правильные данные. Но как сделать чтобы sum(rco.cnt) из разных запросов выдавал в разные столбцы, но на одной строке когда остальные параметры  равны
В С1 так у меня получалось примерно так
Код

select hdo.org o_kod, org.name o_name, spt.kod p_kod, spt.name p_name, sum(rco.cnt) realiz, null zakaz
...
union select hdo.org, org.name, spt.kod, spt.name, null, sum(rco.cnt)
...

Автор: Zloxa 1.7.2009, 17:03
union заменить на union all
,в каждом запросе добавить по дополнительному полю
,группировку вынести на уровень выше.

както так:
Код

select o_kod,o_name,p_kod,p_name, sum(realiz_out),sum(realiz_in)
from (
select hdo.org o_kod, org.name o_name, spt.kod p_kod, spt.name p_name, sum(rco.cnt) realiz_out, 0 realiz_in
from  mn_rc_tov_out rco, mn_hd_tov_out hdo,
      spr_tov spt, spr_org org
where (spt.kod = rco.tov) and
      (rco.doc = hdo.kod) and
      (hdo.ORG = org.kod) and
      (org.grp in (select gr.kod from spr_org_groups gr
                where gr.kod = :grp_list or gr.parentid =:grp_list)) and
      (hdo.DAT = :DAT)
group by hdo.org, org.name, spt.kod, spt.name
union all
select hdo.org, org.name, spt.kod, spt.name,0 realiz_out sum(rco.cnt)
from  mn_rc_tov_reserv  rco, mn_hd_tov_reserv  hdo,
      spr_tov spt, spr_org org
where (spt.kod = rco.tov) and
      (rco.doc = hdo.kod) and
      (hdo.ORG = org.kod) and
      (org.grp in (select gr.kod from spr_org_groups gr
                where gr.kod = :grp_list or gr.parentid =:grp_list)) and
      (hdo.DAT = :DAT)
)
group by o_kod,o_name,p_kod,p_name,

Автор: Filosov 2.7.2009, 14:03
Код

select o_kod, o_name, p_kod, p_name, sum(realiz), sum(zakaz)
from (
select hdo.org o_kod, org.name o_name, spt.kod p_kod, spt.name p_name, rco.cnt realiz, 0.0 zakaz
from  mn_rc_tov_out rco, mn_hd_tov_out hdo,
      spr_tov spt, spr_org org
where (spt.kod = rco.tov) and
      (rco.doc = hdo.kod) and
      (hdo.ORG = org.kod) and
      (rco.cnt > 0 ) and
      (org.grp in (select gr.kod from spr_org_groups gr
                where gr.kod = :grp_list or gr.parentid =:grp_list)) and
      (hdo.DAT = :DAT)

union all select hdo.org, org.name, spt.kod, spt.name, 0.0, rco.cnt
from  mn_rc_tov_reserv  rco, mn_hd_tov_reserv  hdo,
      spr_tov spt, spr_org org
where (spt.kod = rco.tov) and
      (rco.doc = hdo.kod) and
      (hdo.ORG = org.kod) and
      (rco.cnt > 0 ) and
      (org.grp in (select gr.kod from spr_org_groups gr
                where gr.kod = :grp_list or gr.parentid =:grp_list)) and
      (hdo.DAT = :DAT)
 ) group by o_kod,o_name,p_kod,p_name


Выдает ошибку 
Код

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 1.
select.


Если удалить строки 1, 2 и 24 работает. а вот
",группировку вынести на уровень выше." не пашет
Пробую на
Код

IB Expert - The Most Expert for InterBase, Firebird and Yaffil
Copyright (C) 2000-2009 IBExpert KG Version 2009.03.17.3

Код

Firebird 1.5


Автор: Zloxa 2.7.2009, 14:35
мда... как я понял эта фишка(со странным названием "derived tables", когда все остальные это называют subquery) в птице поддерживаться началась только с версии 2.0.

На full join тут, думаю, переделать не удастся.

может на ХП удастся чтото замутить... перенесу ка я тему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)