powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с выборкой
3 сообщений из 3, страница 1 из 1
Помогите с выборкой
    #32020155
Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеются таблица со счетами (Acc):
ID DATEOPEN DATECLOSE
1 01.01.2001 03.12.2001
2 NULL NULL
3 02.12.2001 NULL
4 01.12.2001 NULL
5 01.01.2001 NULL

и таблица с остатками на счетах (rest).
Причем остатки хранятся только за те даты, когда остаток на счете менялся:
ACC_ID DATE REST
1 01.12.2001 1000.0000
1 02.12.2001 2000.0000
2 02.12.2001 2000.0000
4 02.12.2001 2000.0000
1 03.12.2001 3000.0000
2 03.12.2001 3000.0000
3 03.12.2001 3000.0000

И есть какая-то дата BalDate, переданная в качестве параметра.

Результат выборки должен вернуть остатки на всех счетах за указанную BalDate,
при условии что ACC.DATEOPEN <= BalDate и ACC.DATECLOSE >= BalDate.
Например:

если BalDate=01.12.2001, то
ACC_ID DATEOPEN DATECLOSE DATE REST
1 01.01.2001 03.12.2001 01.12.2001 1000.0000
2 NULL NULL NULL NULL
4 01.12.2001 NULL NULL NULL
5 01.12.2001 NULL NULL NULL

если BalDate=02.12.2001, то
ACC_ID DATEOPEN DATECLOSE DATE REST
1 01.01.2001 03.12.2001 02.12.2001 2000.0000
2 NULL NULL 02.12.2001 2000.0000
3 02.12.2001 NULL NULL NULL
4 01.12.2001 NULL 02.12.2001 2000.0000
5 01.12.2001 NULL NULL NULL

если BalDate=03.12.2001, то
ACC_ID DATEOPEN DATECLOSE DATE REST
1 01.01.2001 03.12.2001 03.12.2001 3000.0000
2 NULL NULL 03.12.2001 3000.0000
3 02.12.2001 NULL 03.12.2001 3000.0000
4 01.12.2001 NULL 02.12.2001 2000.0000
5 01.12.2001 NULL NULL NULL

если BalDate=04.12.2001, то
ACC_ID DATEOPEN DATECLOSE DATE REST
2 NULL NULL 03.12.2001 3000.0000
3 02.12.2001 NULL 03.12.2001 3000.0000
4 01.12.2001 NULL 02.12.2001 2000.0000
5 01.12.2001 NULL NULL NULL

написал такой запрос:

SELECT Acc.id, Acc.dateopen, Acc.dateclose, Rest.date, Rest.rest
FROM Acc LEFT OUTER JOIN Rest
ON Acc.id = Rest.acc_id
WHERE (Acc.dateopen IS NULL OR Acc.dateopen <= @BalDate)
AND (Acc.dateclose IS NULL OR Acc.dateclose >= @BalDate)
AND (Rest.date IS NULL OR Rest.date <= @BalDate)
GROUP BY Acc.id

- в результат попадают все счета кроме тех, у которых есть
соответствующие записи в таблице REST но минимальная дата больще BalDate.
Подскажите.
...
Рейтинг: 0 / 0
Помогите с выборкой
    #32020165
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что-ли ?
create table #acc(ID int, DATEOPEN datetime, DATECLOSE datetime)
insert into #acc values(1, '20010101', '20011203')
insert into #acc values(2, NULL, NULL)
insert into #acc values(3, '20011202', NULL )
insert into #acc values(4, '20011201', NULL )
insert into #acc values(5, '20010101', NULL )

create table #rest(ACC_ID int, DATE datetime, REST decimal(10,2))
insert into #rest values(1, '20011201', 1000.0000)
insert into #rest values(1, '20011202', 2000.0000)
insert into #rest values(2, '20011202', 2000.0000)
insert into #rest values(4, '20011202', 2000.0000)
insert into #rest values(1, '20011203', 3000.0000)
insert into #rest values(2, '20011203', 3000.0000)
insert into #rest values(3, '20011203', 3000.0000)

declare @baldate datetime
set @baldate = '20011204'


select a.* ,
(select top 1 date from #rest b where b.acc_id = a.id and b.date <= @baldate order by date desc) as date,
(select top 1 rest from #rest b where b.acc_id = a.id and b.date <= @baldate order by date desc) as rest
from #acc a
where isnull(a.dateopen, '19000101') <= @BalDate
and isnull(a.dateclose, '99991231') >= @BalDate


drop table #rest
drop table #acc
...
Рейтинг: 0 / 0
Помогите с выборкой
    #32020225
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Glory!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с выборкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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