powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Select
7 сообщений из 7, страница 1 из 1
Select
    #39866116
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые, помогите пожалуйста с запросом! У самой не получается.

Имеем три таблицы:
Tab1 - Id, Fio (Id уникально)
Tab2 и Tab3 - Id, Dat_p
нужно выбрать Sele Id, Fio, max(Dat_p) as ДатаПос From Tab1 ......
всех из Tab1 Id которых нет в Tab2,Tab3 .OR. (Id есть в Tab2 или в Tab3 .AND. Max(Dat_p)<GoMonth(Date(),-12)) прошло более года
...
Рейтинг: 0 / 0
Select
    #39866250
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Людмila,

Где-то так:

Код: sql
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.
CREATE CURSOR tab1 (ID int, FIO c(20))

CREATE CURSOR tab2 (ID int, Dat_p d)

CREATE CURSOR tab3 (ID int, Dat_p d)

INSERT INTO tab1 VALUES (1, 'Ivanoff')
INSERT INTO tab1 VALUES (2, 'Petroff')
INSERT INTO tab1 VALUES (3, 'Sidoroff')
INSERT INTO tab1 VALUES (4, 'Smirnoff')

INSERT INTO tab2 VALUES (1, DATE(2019, 1, 1))
INSERT INTO tab2 VALUES (1, DATE(2018, 1, 1))
INSERT INTO tab2 VALUES (2, DATE(2019, 1, 1))

INSERT INTO tab3 VALUES (2, DATE(2018, 1, 1))
INSERT INTO tab3 VALUES (3, DATE(2019, 1, 1))

SELECT tab1.ID, tab1.FIO, t23.Dat_p FROM tab1;
left JOIN ;
(;
select MAX(Dat_p) as Dat_p, ID FROM tab2 GROUP BY tab2.ID;
union;
select MAX(Dat_p) as Dat_p, ID FROM tab3 GROUP BY tab3.ID;
) as t23 on t23.ID = tab1.ID ;
left join ;
(;
select * from tab1 where ;
not exists (select * from tab2 where tab2.id = tab1.id);
and;
not exists (select * from tab3 where tab3.id = tab1.id);
) as t32 on t32.id = tab1.id;
where t23.Dat_p  < GOMONTH(DATE(), -12) or t32.id is not null
...
Рейтинг: 0 / 0
Select
    #39866323
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вообще-то, если из подчиненных таблиц надо достать ТОЛЬКО дату, то можно и попроще сделать

Код: sql
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.
CREATE CURSOR tab1 (ID int, FIO c(20))

CREATE CURSOR tab2 (ID int, Dat_p d)

CREATE CURSOR tab3 (ID int, Dat_p d)

INSERT INTO tab1 VALUES (1, 'Ivanoff')
INSERT INTO tab1 VALUES (2, 'Petroff')
INSERT INTO tab1 VALUES (3, 'Sidoroff')
INSERT INTO tab1 VALUES (4, 'Smirnoff')

INSERT INTO tab2 VALUES (1, DATE(2019, 1, 1))
INSERT INTO tab2 VALUES (1, DATE(2018, 1, 1))
INSERT INTO tab2 VALUES (2, DATE(2019, 1, 1))

INSERT INTO tab3 VALUES (2, DATE(2018, 1, 1))
INSERT INTO tab3 VALUES (3, DATE(2019, 1, 1))

SELECT ;
	tab1.ID, ;
	tab1.FIO, ;
	max(iif(nvl(tab2.Dat_p,{}) >= nvl(tab3.Dat_p,{}), tab2.Dat_p, tab3.Dat_p)) as maxDat_p ;
FROM tab1;
left JOIN tab2 on tab1.id = tab2.id ;
left JOIN tab3 on tab1.id = tab3.id ;
group by ;
	tab1.ID, ;
	tab1.FIO ;
having max(iif(nvl(tab2.Dat_p,{}) >= nvl(tab3.Dat_p,{}), tab2.Dat_p, tab3.Dat_p)) < GoMonth(Date(),-12))
...
Рейтинг: 0 / 0
Select
    #39866404
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Владимир!

ВладимирМНу, вообще-то, если из подчиненных таблиц надо достать ТОЛЬКО дату, то можно и попроще сделать



1. Код с ошибкой, скобку конечную надо убрать:

having max(iif(nvl(tab2.Dat_p,{}) >= nvl(tab3.Dat_p,{}), tab2.Dat_p, tab3.Dat_p)) < GoMonth(Date(),-12) )


2. Куда-то потерялся Smirnoff, которого нет в таблицах 2 и 3

Людмila всех из Tab1 Id которых нет в Tab2,Tab3 .OR.

и Petroff который есть в табл3 и дата у него 2018г.
...
Рейтинг: 0 / 0
Select
    #39866599
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist, большое спасибо!

Силилась разобраться в запросе - поняла, что такого мне самой не создать, однако.
Всё работает! еще раз спасибочки!
...
Рейтинг: 0 / 0
Select
    #39866647
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist2. Куда-то потерялся Smirnoff, которого нет в таблицах 2 и 3

Людмila всех из Tab1 Id которых нет в Tab2,Tab3 .OR.

и Petroff который есть в табл3 и дата у него 2018г.

Привет. Мог бы и поправить :) Надо в having дополнительно nvl() обернуть результат. Поскольку для этого случая max() вернет null

Код: sql
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.
CREATE CURSOR tab1 (ID int, FIO c(20))

CREATE CURSOR tab2 (ID int, Dat_p d)

CREATE CURSOR tab3 (ID int, Dat_p d)

INSERT INTO tab1 VALUES (1, 'Ivanoff')
INSERT INTO tab1 VALUES (2, 'Petroff')
INSERT INTO tab1 VALUES (3, 'Sidoroff')
INSERT INTO tab1 VALUES (4, 'Smirnoff')

INSERT INTO tab2 VALUES (1, DATE(2019, 1, 1))
INSERT INTO tab2 VALUES (1, DATE(2018, 1, 1))
INSERT INTO tab2 VALUES (2, DATE(2019, 1, 1))

INSERT INTO tab3 VALUES (2, DATE(2018, 1, 1))
INSERT INTO tab3 VALUES (3, DATE(2019, 1, 1))

SELECT ;
	tab1.ID, ;
	tab1.FIO, ;
	max(iif(nvl(tab2.Dat_p,{}) >= nvl(tab3.Dat_p,{}), tab2.Dat_p, tab3.Dat_p)) as maxDat_p ;
FROM tab1;
left JOIN tab2 on tab1.id = tab2.id ;
left JOIN tab3 on tab1.id = tab3.id ;
group by ;
	tab1.ID, ;
	tab1.FIO ;
having nvl(max(iif(nvl(tab2.Dat_p,{}) >= nvl(tab3.Dat_p,{}), tab2.Dat_p, tab3.Dat_p)), {}) < GoMonth(Date(),-12)
...
Рейтинг: 0 / 0
Select
    #39868226
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге оказалось:
в рецепте от ВладимирМ разобралась - естественно юзаю его, но Select от PaulWist пошустрее, но всё равно оба запроса отрабатывают мгновенно!
Ещё раз большое спасибо! Очень помогли.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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