powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Запрос по периодам
7 сообщений из 7, страница 1 из 1
Запрос по периодам
    #37338709
Misha_LV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия ASA 9
Помогите пожалуйста с запросом
есть 2 таблицы
create table z1 (ls integer,ds date ,dpo date,x integer);
create table z2 (ls integer,ds date ,dpo date,y varchar(10));

где х например какой либо счет,даты соответственно дата с и дата по,x и y какие либо параметры

insert into z1(ls,ds,dpo,x)
values(1,'2005-01-01','2005-12-31',10);
insert into z1(ls,ds,dpo,x)
values(1,'2006-01-01','2006-05-31',20);

insert into z2(ls,ds,dpo,y)
values(1,'2005-02-01','2005-02-28','Да');
insert into z2(ls,ds,dpo,y)
values(1,'2005-03-01','2050-01-01','Нет');

Как получить данные вида ls,ds,dpo,x,y со всеми периодами ,по таблице z1
Результат:
1 '2005-01-01' '2005-01-31' 10 null
1 '2005-02-01' '2005-02-28' 10 'Да'
1 '2005-03-01' '2005-12-31' 10 'Нет'
1 '2006-01-01' '2006-05-31' 20 'Нет'

Возможно ли это написать одним запросом или необходимо анализировать данные по курсору и т.д ?
...
Рейтинг: 0 / 0
Запрос по периодам
    #37340372
escapist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha_LV,
В похожей ситуации (z1-когда должен был работать,z2-когда фактически был на работе),одним запросом не обошлись,но вроде и до курсора не опускались(через временную таблицу,но нам надо было хранить результат пересечения)
...
Рейтинг: 0 / 0
Запрос по периодам
    #37340862
Misha_LV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал по курсору
Код: 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.
create table z3 (ls integer,ds date ,dpo date,x integer,y char( 10 ));
delete z3;
begin
declare tmpdate date;declare tmpcorr date;
FOR Loopspis as Curspis dynamic scroll cursor for
select z1.ls as zls,z1.ds as zds,z1.dpo as zdpo,z1.x as zx
from z1 do
set tmpdate=zds;
while tmpdate<zdpo loop
set tmpcorr=null;
select min(dk) into tmpcorr from 
(select ls,ds as dk
from z2 where z2.ls=zls and ds >tmpdate and ds<zdpo
union
select ls,dpo+ 1  as dk
from z2 where z2.ls=zls and dpo >tmpdate and dpo<zdpo) as tt
group by ls;
if tmpcorr is null then set tmpcorr=zdpo+ 1  end if;

insert into z3(ls,ds,dpo,x,y)
values( zls,tmpdate,tmpcorr- 1 ,zx,null);
set tmpdate=tmpcorr;
end loop;

end for;
end;

select z3.ls,z3.ds,z3.dpo,z3.x,z2.y from z3 left outer join z2 on (z3.ls=z2.ls and z3.ds between z2.ds and z2.dpo) ;

Результат то верен ,но чувствую на реальных данных с большим количеством записей ,будут тормоза.Может у кого была подобная задачка,поделитесь наработками плиз =).База данных состоит из таблиц с полями "с" и "по",необходимо создать одну таблицу с "с" и "по" со всеми параметрами.

Модератор: Не забывай о кнопке SRC.
Прочитай 10533930
...
Рейтинг: 0 / 0
Запрос по периодам
    #37341568
KSerega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
insert into z1(ls,ds,dpo,x)
values( 1 ,'2006-06-01','2006-06-30', 20 );
insert into z1(ls,ds,dpo,x)
values( 1 ,'2006-07-01','2006-12-31', 10 );


create VIEW "DBA"."z3" as /* view_column_name, ... */
  /* Type the select statement here */
  select z1.ls,z1.ds,z1.dpo,z1.x,null as y
    from DBA.z1 union all
  select z2.ls,z2.ds,z2.dpo,null as x,z2.y
    from DBA.z2

select z.ls,z.ds,
(select first z1.dpo from z3 as z1 where z.ls = z1.ls
and isnull(z.x, 0 )=isnull(z1.x, 0 )
and z.ds < z1.dpo 
and not exists(select * from z3 as z3 where z1.ls=z3.ls and isnull(z1.x, 0 )=isnull(z3.x, 0 ) and z3.ds = z1.dpo+ 1 )
) as dpo,
isnull(z.x,(select first z1.x from z3 as z1 where z.ls = z1.ls
and z1.dpo+ 1  <= z.ds and z1.x is not null order by z1.ds desc
)) as x,
isnull(z.y,(select first z1.y from z3 as z1 where z.ls = z1.ls
and z1.dpo+ 1  <= z.ds and z1.y is not null order by z1.ds desc
)) as y
from z3 as z
where not exists(select * from z3 as z2 where z.ls = z2.ls
and isnull(z.x, 0 ) = isnull(z2.x, 0 ) and isnull(z.y,'') = isnull(z2.y,'')
and z.ds = z2.dpo+ 1 ) 
order by z.ds

Модератор: Не забывай о кнопке SRC.
Прочитай 10533930
...
Рейтинг: 0 / 0
Запрос по периодам
    #37342478
Misha_LV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KSerega запрос который ты написал не работает на 9-ой версии ASA.
"Возвращенный результат не является детерминированным.SQLCODE=122,ODBC 3 State =01000 Line 2,column1".
...
Рейтинг: 0 / 0
Запрос по периодам
    #37342761
KSerega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
под 10 писал
...
Рейтинг: 0 / 0
Запрос по периодам
    #37345385
Ork_pb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot KSerega]
Код: plaintext
1.
2.
3.
4.
5.
select z.ls,z.ds,
(select first z1.dpo from z3 as z1 where z.ls = z1.ls
and isnull(z.x, 0 )=isnull(z1.x, 0 )
and z.ds < z1.dpo 
and not exists(select * from z3 as z3 where z1.ls=z3.ls and isnull(z1.x, 0 )=isnull(z3.x, 0 ) and z3.ds = z1.dpo+ 1 )
) as dpo


Добавить order by в подзапросе нужно, всегда где есть first должен быть order by.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Запрос по периодам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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