Выборка из таблицы остатков
AlexanderVS
Дата: 18.01.2001 05:29:41
Здравствуйте.
Есть таблица, где хранятся остатки по счетам, текущий остаток записывается только в том случае, если по счету было движение иначе используется остаток за предидущие даты. Необходимо выдать отчет - Остатки по счетам на конкретную дату, нулевые остатки в отчет не включаются.
Date ID Rest
01.01.01 1 1
01.01.01 2 1
01.01.01 3 1
03.01.01 2 0
03.01.01 3 0
04.01.01 1 0
В текущей ситуации на 1 число - остатки у всех 1, на 3 число - по счету 1 остатток 1, по счетам 2 и 3 - 0, на 4 число - по всем счетам 0.
Пишу что то типа: SELECT MAX(date) AS D, id, rest FROM TABLE1 where date<='03.01.01' GROUP BY id, rest , в результате выдаются все строки, а мне фактически нужно только 1 счет у которого остаток равен 1.
Как тут поступить, помогите, плиз!
Staple
Дата: 18.01.2001 10:07:51
SELECT MAX(date) AS D, id, rest FROM TABLE1
WHERE date<='03.01.01' AND id NOT IN
(SELECT id FROM Table1 WHERE date<='03.01.01' AND rest = 0)
GROUP BY id, rest
Очень похоже на правду.
Dmitry
Дата: 18.01.2001 10:35:25
А не проще
SELECT MAX(date) AS D, id, rest
FROM TABLE1 where date<='03.01.01' and rest<>0
GROUP BY id, rest
Staple
Дата: 18.01.2001 10:48:50
Гораздо проще! Но неправильно... Таким образом ты выберешь все счета, по которым остатки были до 3-его ненулевыми, не учитывая, что они могли до 3-его же и занулиться.
PS Кстати, мой вариант годится только в том случае, если эти пресловутые остатки не имеют тенденции возрождаться, и после обнуления опять ползти вверх. В бухгалтерии я, мягко говоря, не силен, да и что там у вас в конторе творится - мне невдомек, так что извини, если что не так...
Staple
Дата: 18.01.2001 10:51:41
Гораздо проще! Но неправильно... Таким образом ты выберешь все счета, по которым остатки были до 3-его ненулевыми, не учитывая, что они могли до 3-его же и занулиться.
PS Кстати, мой вариант годится только в том случае, если эти пресловутые остатки не имеют тенденции возрождаться, и после обнуления опять ползти вверх. В бухгалтерии я, мягко говоря, не силен, да и что там у вас в конторе творится - мне невдомек, поэтому я и руководствовался собственными понятиями об остатках.
SergSuper
Дата: 18.01.2001 11:38:48
Посмотри мой ответ, он там предпоследний.
http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=253&Idle=365&Sort=0&Order=Descend&Page=4&Session=
Если что можно вопросы по почте
С приветом Сергей
sergsuper@mail.ru
Garya
Дата: 18.01.2001 20:21:57
По-моему все предыдущие ответы были НЕ на поставленный вопрос. А на поставленный вопрос ответ совсем простой. Если я правильно вопрос понял, остатки уже получены. В вопросе также четко говорится фраза "на заданную дату", поэтому никакие max(Date) не нужны. Нужно отфильтровать ненулевые остатки. Это всего лишь select * from AnyTable where Rest>0. И все! Если автор вопроса подразумевал нечто другое, то и вопрос нужно ставить более четко.
AlexanderVS
Дата: 19.01.2001 05:28:48
Да, в вопрсе сказано, что нужны остатки на конкретную дату, но там же сказано, что текущий остаток заносится в таблицу только в том случае, если по счету была проводка, в противном случае необходимо выбирать остаток за предидущие даты.
Всех благ, Александр.
SergSuper
Дата: 19.01.2001 11:02:22
Пока человеку совсем голову не задурили, напишу правильный ответ
code:
Но если много записей и желательно как-то ускорить время выполнения, то лучше последний запрос разбить на два и использовать временную таблицу:
code:
В любом случае нужен или вложенный запрос или временная таблица, т.е. простым одним select-ом не обойтись.
Кто знает как можно по другому - напишите. Буду рад посмотреть.
С приветом Сергей
SergSuper
Дата: 19.01.2001 11:05:39
ой блин, какая-то фигня получилась, хотел по-красивше ниписать. Должно было быть так:
create table #ost(Date datetime, ID int, Rest int)
insert #ost
select '20000101',1, 1
union select '20000101',2, 1
union select '20000101',3, 1
union select '20000103',2, 0
union select '20000103',3, 0
union select '20000104',1, 0
go
declare @d datetime
select @d='20000103'
select o1.ID , o1.Rest
from #ost o1
where Date=(select max(Date) from #ost o2 where o2.ID=o1.ID and Date<=@d)
and o1.Rest>0
Но если много записей и желательно как-то ускорить время выполнения, то лучше последний запрос разбить на два и использовать временную таблицу:
declare @d datetime
select @d='20000103'
select ID, max(Date) d
into #d from #ost
where Date<=@d
group by ID
select o1.ID , o1.Rest
from #ost o1, #d d
where Date=d and d.ID=o1.ID
and o1.Rest>0
В любом случае нужен или вложенный запрос или временная таблица, т.е. простым одним select-ом не обойтись.
Кто знает как можно по другому - напишите. Буду рад посмотреть.
С приветом Сергей