powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / вопрос про compound
13 сообщений из 13, страница 1 из 1
вопрос про compound
    #35369735
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как сделать чтоб следующее возвращало данные клиенту ??? Ато только говорит что выполнено успешно (в редакторе команд)... а нужно получить результаты select а...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
BEGIN atomic
DECLARE MES1 INTEGER ;
DECLARE GOD1 INTEGER ;
DECLARE DAT1 DATE ;
DECLARE olgaz1 FLOAT ;
DECLARE S_GAZPRIBOR1 FLOAT ;

SET MES1= 2  ;
SET GOD1= 2008  ;
SET OLGAZ1= 1000000  ;

SET DAT1=LASTDATE(MES1,GOD1) ;

SET S_GAZPRIBOR1=(select SUM(pg4_11*os* 11 )+SUM(pg4_15*os* 15 )+SUM(pg2_11*os* 11 )+SUM(pg2_15*os* 15 )+SUM(titan*os* 16 )+SUM(hommom*os* 16 )+SUM(case when (mes1= 1  or mes1= 2  or mes1= 3  or mes1= 11  or mes1= 12 ) then case when m3- 43 *os> 0  then  43 *os* 5 . 76 +(m3- 43 *os)* 5 . 76 * 1 . 5  else m3* 5 . 76  end else  0  end)+SUM(quy* 2 . 2 )+SUM(mol* 23 . 7 )+SUM(svin* 15 ) from inventar where (inventar.ds is null or inventar.ds<=dat1) and (inventar.do is null or inventar.do>dat1)) ;

select aa.idmah,aa.name as mah,aa.fio as kontroler,cc.ab_s,cc.shet,cc.otkl,cc.normativ,
cc.gazpribor,
CAST(olgaz1 as double)/CAST(s_gazpribor1 as double)*cc.gazpribor as gazfakt,
aa.vs_gaz+case when bb.noqon_gaz is null then  0 . 00  else bb.noqon_gaz end+case when bb.prod_gaz is null then  0 . 00  else bb.prod_gaz end as gazrazn,
case when s_gazpribor1*cc.gazpribor= 0  then  0  else (aa.vs_gaz+case when bb.noqon_gaz is null then  0 . 00  else bb.noqon_gaz end+case when bb.prod_gaz is null then  0 . 00  else bb.prod_gaz end)/(CAST(olgaz1 as double)/CAST(s_gazpribor1 as double)*cc.gazpribor)* 100  end as foizgaz,
aa.p_shet,cc.kolvo_no_shetgaz,
case when cc.shet= 0  then  0  else cast((cc.shet-cc.kolvo_no_shetgaz) as float)/cast(cc.shet as float)* 100  end as foizpok,
case when cc.shet-cc.kolvo_no_shetgaz= 0  then  0  else aa.p_shet/(cc.shet-cc.kolvo_no_shetgaz) end as urt_1,
aa.p50,aa.p100,aa.p300,aa.p600,aa.p6000,
aa.p_norma,bb.noqon_gaz,noqon_gaz_soni,bb.prod_gaz
from 
(select a.idmah,c.name,d.fio,sum(b.p_shet) as p_shet,sum(b.p_11+b.p_15+b.p_16+b.p_otop+b.p_jiv) as p_norma,
sum(b.p_shet+b.p_11+b.p_15+b.p_16+b.p_otop+b.p_jiv) as vs_gaz,
sum(case when b.p_shet> 0  and b.p_shet< 50  then  1  else  0  end) as p50,
sum(case when b.p_shet>= 50  and b.p_shet< 100  then  1  else  0  end) as p100,
sum(case when b.p_shet>= 100  and b.p_shet< 300  then  1  else  0  end) as p300,
sum(case when b.p_shet>= 300  and b.p_shet< 600  then  1  else  0  end) as p600,
sum(case when b.p_shet>= 600  then  1  else  0  end) as p6000
from abonent  a left join osv b on a.id=b.idab 
left join mahalla c on a.idmah=c.id left join kontroler d on c.idkontroler=d.id
where b.mes=mes1 and b.god=god1 group by a.idmah,c.name,d.fio) aa

left join 

(select abonent.idmah as idmah1,SUM(case when pach_akt.name like '%####%' then  0 . 00  else akt.summa/tar.typ1 end) as noqon_gaz,
SUM(case when pach_akt.name like '%####%' then  0  else  1  end) as noqon_gaz_soni,
SUM(case when pach_akt.name like '%####%' then akt.summa/tar.typ3 else  0 . 00  end) as prod_gaz
from akt left join osv on akt.idosv=osv.id
left join abonent on osv.idab=abonent.id left join pach_akt on akt.idpach_akt=pach_akt.id
left join (select typ1,typ2,typ3 from tarif where (ds is null or ds<=lastdate(mes1,god1))
and (do is null or do>lastdate(mes1,god1))) tar on  1 = 1 
where osv.mes=mes1 and osv.god=god1 and (akt.typakt= 5  or akt.typakt= 7  or akt.typakt= 1 ) and akt.summa> 0  group by abonent.idmah) bb
on aa.idmah=bb.idmah1 

left join

(select abonent.idmah,SUM(pg4_11*os* 11 )+SUM(pg4_15*os* 15 )+SUM(pg2_11*os* 11 )+SUM(pg2_15*os* 15 )+
SUM(titan*os* 16 )+SUM(hommom*os* 16 )+
SUM(case when (mes1= 1  or mes1= 2  or mes1= 3  or mes1= 11  or mes1= 12 ) then 
case when m3- 43 *os> 0  then  43 *os* 5 . 76 +(m3- 43 *os)* 5 . 76 * 1 . 5  else m3* 5 . 76  end else  0  end)+
SUM(quy* 2 . 2 )+SUM(mol* 23 . 7 )+SUM(svin* 15 ) as gazpribor,
count(*) as ab_s,SUM(case when inventar.otkl= 1  then  0  else inventar.shet end) as shet,SUM(inventar.otkl) as otkl,
COUNT(*)-SUM(inventar.otkl)-SUM(case when inventar.otkl= 1  then  0  else inventar.shet end) as normativ,
sum(case when inventar.shet= 1  and not(inventar.otkl= 1 ) and (osv.p_shet= 0  or osv.p_shet is null) then  1  else  0  end) as kolvo_no_shetgaz
from inventar left join abonent on inventar.idab=abonent.id left join osv on abonent.id=osv.idab
where (inventar.ds is null or inventar.ds<=lastdate(mes1,god1)) and (inventar.do is null or inventar.do>lastdate(mes1,god1)) 
and osv.mes=mes1 and osv.god=god1 group by abonent.idmah) cc
on aa.idmah=cc.idmah
order by aa.idmah ;



END @

...
Рейтинг: 0 / 0
вопрос про compound
    #35369749
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB2 V9.1
...
Рейтинг: 0 / 0
вопрос про compound
    #35369851
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или пишите запрос или пишите процедуру которая возвращает открытый курсор.
зачем вам именно compound?
...
Рейтинг: 0 / 0
вопрос про compound
    #35370646
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
процедуру не можем написать - нет доступа. а как этот запрос написать одним махом? Обратите внимание на S_GAZPRIBOR1... её надо получить потом использовать во втором запросе...
...
Рейтинг: 0 / 0
вопрос про compound
    #35370754
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конструкцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with 
  c1(MES1, GOD1, OLGAZ1, DAT1) AS 
  (VALUES ( 2 ,  2008 ,  1000000 , LASTDATE( 2 , 2008 )))
, c2 (MES1, GOD1, OLGAZ1, DAT1, S_GAZPRIBOR1) as
(
select c1.MES1, c1.GOD1, c1.OLGAZ1, c1.DAT1
, SUM(pg4_11*os* 11 )+SUM(pg4_15*os* 15 )+SUM(pg2_11*os* 11 )+SUM(pg2_15*os* 15 )
+SUM(titan*os* 16 )+SUM(hommom*os* 16 )+SUM(case when (mes1= 1  or mes1= 2  or mes1= 3  or mes1= 11  or mes1= 12 ) then case when m3- 43 *os> 0  then  43 *os* 5 . 76 +(m3- 43 *os)* 5 . 76 * 1 . 5  else m3* 5 . 76  end else  0  end)+SUM(quy* 2 . 2 )+SUM(mol* 23 . 7 )+SUM(svin* 15 ) S_GAZPRIBOR1
from inventar, c1
where (inventar.ds is null or inventar.ds<=c1.dat1) and (inventar.do is null or inventar.do>c1.dat1)
)
ставим перед селектом.
Это будет временная таблица констант, состоящая из 1 строки.
Далее везде, где надо использовать эти константы, таблица c2 вставляется в from и ее поля используются.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
with c1..., c2 ...
select ...
, CAST(olgaz1 as double)/CAST(c2.gazpribor1 as double)*cc.gazpribor as gazfakt
, ..
from (...) aa 
join c2 on  1 = 1 
left join (select ..., c2.*, ... from akt join c2 on  1 = 1  left join osv ...) bb ...
left join (...) cc ...
...
...
Рейтинг: 0 / 0
вопрос про compound
    #35370763
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в дополнение к тому, что написал Марк.
Обратите внимание на конструкцию values. В DB2 эта конструкция имеет более широкий смысл чем в дугих сервнразх БД. Она позволяет сгенерировать статическую таблицу буквально на пустос месте. Попробуйте:


Код: plaintext
1.
 values ( 1 ,'A'),( 2 ,'B'),( 3 ,'C')
...
Рейтинг: 0 / 0
вопрос про compound
    #35371914
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем!!!
...
Рейтинг: 0 / 0
вопрос про compound
    #35371927
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё отлично получилось... Тока вот во времени исполнения некоторая задержка имеется... большой запрос (после блока with) запрашивается из 3-х подзапросов.... так вот каждый из них (в комбинации with) отрабатывает за доли сек. , а большой висит 15 сек.
не подскажите куда копать???

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
with 
  c1(MES1, god1, OLGAZ1, DAT1) AS 
  (VALUES (?mes11, ?god11, ?olgaz11, LASTDATE(?mes11,?god11)))
, c2 (MES1, god1, OLGAZ1, DAT1, S_GAZPRIBOR1) as
(
select c1.MES1, c1.god1, c1.OLGAZ1, c1.DAT1
, SUM(pg4_11*os* 11 )+SUM(pg4_15*os* 15 )+SUM(pg2_11*os* 11 )+SUM(pg2_15*os* 15 )
+SUM(titan*os* 16 )+SUM(hommom*os* 16 )+SUM(case when (mes1= 1  or mes1= 2  or mes1= 3  or mes1= 11  or mes1= 12 ) then case when m3- 43 *os> 0  then  43 *os* 5 . 76 +(m3- 43 *os)* 5 . 76 * 1 . 5  else m3* 5 . 76  end else  0  end)+SUM(quy* 2 . 2 )+SUM(mol* 23 . 7 )+SUM(svin* 15 ) S_GAZPRIBOR1
from inventar, c1
where (inventar.ds is null or inventar.ds<=c1.dat1) and (inventar.do is null or inventar.do>c1.dat1) group by c1.MES1, c1.god1, c1.OLGAZ1, c1.DAT1
)
select aa.idmah,aa.name as mah,aa.fio as kontroler,cc.ab_s,cc.shet,cc.otkl,cc.normativ,
cc.gazpribor,CAST(c2.olgaz1 as double)/CAST(c2.S_GAZPRIBOR1 as double)*cc.gazpribor as gazfakt,
aa.vs_gaz+case when bb.noqon_gaz is null then  0 . 00  else bb.noqon_gaz end+case when bb.prod_gaz is null then  0 . 00  else bb.prod_gaz end as gazrazn,
case when c2.S_GAZPRIBOR1*cc.gazpribor= 0  then  0  else (aa.vs_gaz+case when bb.noqon_gaz is null then  0 . 00  else bb.noqon_gaz end+case when bb.prod_gaz is null then  0 . 00  else bb.prod_gaz end)/(CAST(c2.olgaz1 as double)/CAST(c2.S_GAZPRIBOR1 as double)*cc.gazpribor)* 100  end as foizgaz,
aa.p_shet,cc.kolvo_no_shetgaz,
case when cc.shet= 0  then  0  else cast((cc.shet-cc.kolvo_no_shetgaz) as float)/cast(cc.shet as float)* 100  end as foizpok,
case when cc.shet-cc.kolvo_no_shetgaz= 0  then  0  else aa.p_shet/(cc.shet-cc.kolvo_no_shetgaz) end as urt_1,
aa.p50,aa.p100,aa.p300,aa.p600,aa.p6000,
aa.p_norma,bb.noqon_gaz,noqon_gaz_soni,bb.prod_gaz
	from 
	(select a.idmah,c.name,d.fio,sum(b.p_shet) as p_shet,sum(b.p_11+b.p_15+b.p_16+b.p_otop+b.p_jiv) as p_norma,
		sum(b.p_shet+b.p_11+b.p_15+b.p_16+b.p_otop+b.p_jiv) as vs_gaz,
		sum(case when b.p_shet> 0  and b.p_shet< 50  then  1  else  0  end) as p50,
		sum(case when b.p_shet>= 50  and b.p_shet< 100  then  1  else  0  end) as p100,
		sum(case when b.p_shet>= 100  and b.p_shet< 300  then  1  else  0  end) as p300,
		sum(case when b.p_shet>= 300  and b.p_shet< 600  then  1  else  0  end) as p600,
		sum(case when b.p_shet>= 600  then  1  else  0  end) as p6000
			from abonent  a left join osv b on a.id=b.idab 
			left join mahalla c on a.idmah=c.id left join kontroler d on c.idkontroler=d.id left join c2 on  1 = 1 
			where b.mes=c2.mes1 and b.god=c2.god1 group by a.idmah,c.name,d.fio) aa
	left join 
	(select abonent.idmah as idmah1,SUM(case when pach_akt.name like '%####%' then  0 . 00  else akt.summa/tar.typ1 end) as noqon_gaz,
		SUM(case when pach_akt.name like '%####%' then  0  else  1  end) as noqon_gaz_soni,
		SUM(case when pach_akt.name like '%####%' then akt.summa/tar.typ3 else  0 . 00  end) as prod_gaz
			from akt left join osv on akt.idosv=osv.id
			left join abonent on osv.idab=abonent.id left join pach_akt on akt.idpach_akt=pach_akt.id
			left join 
				(select typ1,typ2,typ3 from tarif left join c2 on  1 = 1  where (ds is null or ds<=lastdate(c2.mes1,c2.god1))
				and (do is null or do>lastdate(c2.mes1,c2.god1))) tar on  1 = 1  
			left join c2 on  1 = 1 
			where osv.mes=c2.mes1 and osv.god=c2.god1 and (akt.typakt= 5  or akt.typakt= 7  or akt.typakt= 1 ) and akt.summa> 0  group by abonent.idmah) bb
	on aa.idmah=bb.idmah1 
	left join
	(select abonent.idmah,SUM(pg4_11*os* 11 )+SUM(pg4_15*os* 15 )+SUM(pg2_11*os* 11 )+SUM(pg2_15*os* 15 )+
		SUM(titan*os* 16 )+SUM(hommom*os* 16 )+
		SUM(case when (c2.mes1= 1  or c2.mes1= 2  or c2.mes1= 3  or c2.mes1= 11  or c2.mes1= 12 ) then 
		case when m3- 43 *os> 0  then  43 *os* 5 . 76 +(m3- 43 *os)* 5 . 76 * 1 . 5  else m3* 5 . 76  end else  0  end)+
		SUM(quy* 2 . 2 )+SUM(mol* 23 . 7 )+SUM(svin* 15 ) as gazpribor,
		count(*) as ab_s,SUM(case when inventar.otkl= 1  then  0  else inventar.shet end) as shet,SUM(inventar.otkl) as otkl,
		COUNT(*)-SUM(inventar.otkl)-SUM(case when inventar.otkl= 1  then  0  else inventar.shet end) as normativ,
		sum(case when inventar.shet= 1  and not(inventar.otkl= 1 ) and (osv.p_shet= 0  or osv.p_shet is null) then  1  else  0  end) as kolvo_no_shetgaz
			from inventar left join abonent on inventar.idab=abonent.id left join osv on abonent.id=osv.idab left join c2 on  1 = 1 
			where (inventar.ds is null or inventar.ds<=lastdate(c2.mes1,c2.god1)) and (inventar.do is null or inventar.do>lastdate(c2.mes1,c2.god1)) 
			and osv.mes=c2.mes1 and osv.god=c2.god1 group by abonent.idmah) cc
	on aa.idmah=cc.idmah left join c2 on  1 = 1 
order by aa.idmah @

...
Рейтинг: 0 / 0
вопрос про compound
    #35372673
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря LEFT OUTER тяжелы в исполнении.
Но самый главный вопрос - скольго записей созвращает сие чудо?
...
Рейтинг: 0 / 0
вопрос про compound
    #35372674
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, первым делом нужно посмотреть план запроса. Умеете?
Есть ли тэйблсканы?
...
Рейтинг: 0 / 0
вопрос про compound
    #35372675
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно если уберете order by то будет побыстрее...
...
Рейтинг: 0 / 0
вопрос про compound
    #35373247
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ilhom_uzне подскажите куда копать?1. Вы злоупотребляете left join'ами.
Бессмысленно соединять таблицу left join'ом и использовать ссылки на ее поля в where - это искусственное ухудшение плана доступа.
Например, это касается всех ссылок на таблицу констант c2, таблицы с алиасами b, osv.
2. Вы по-прежнему используете функцию lastdate в основном запросе, хотя в таблице констант есть соотв. поле.
3. Вместо выражения типа (akt.typakt=5 or akt.typakt=7 or akt.typakt=1) лучше akt.typakt in (1,5,7)
4. Если можно, то надо что-то сделать с логикой для (inventar.ds is null or inventar.ds<=const). Такие выражения мешают возможному использованию индекса по ds.
Желательно запретить использование null для этого поля, если возможно.
5. Попробовать понизить уровень оптимизации. Можно даже до 1 или 0.

А вообще, конечно, надо план доступа смотреть.
...
Рейтинг: 0 / 0
вопрос про compound
    #35375547
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Mark

Спасибо за советы...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / вопрос про compound
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]