|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть таблица, где хранятся остатки по счетам, текущий остаток записывается только в том случае, если по счету было движение иначе используется остаток за предидущие даты. Необходимо выдать отчет - Остатки по счетам на конкретную дату, нулевые остатки в отчет не включаются. 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. Как тут поступить, помогите, плиз! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 05:29 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
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 Очень похоже на правду. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 10:07 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
А не проще SELECT MAX(date) AS D, id, rest FROM TABLE1 where date<='03.01.01' and rest<>0 GROUP BY id, rest ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 10:35 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
Гораздо проще! Но неправильно... Таким образом ты выберешь все счета, по которым остатки были до 3-его ненулевыми, не учитывая, что они могли до 3-его же и занулиться. PS Кстати, мой вариант годится только в том случае, если эти пресловутые остатки не имеют тенденции возрождаться, и после обнуления опять ползти вверх. В бухгалтерии я, мягко говоря, не силен, да и что там у вас в конторе творится - мне невдомек, так что извини, если что не так... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 10:48 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
Гораздо проще! Но неправильно... Таким образом ты выберешь все счета, по которым остатки были до 3-его ненулевыми, не учитывая, что они могли до 3-его же и занулиться. PS Кстати, мой вариант годится только в том случае, если эти пресловутые остатки не имеют тенденции возрождаться, и после обнуления опять ползти вверх. В бухгалтерии я, мягко говоря, не силен, да и что там у вас в конторе творится - мне невдомек, поэтому я и руководствовался собственными понятиями об остатках. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 10:51 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
Посмотри мой ответ, он там предпоследний. 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 11:38 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
По-моему все предыдущие ответы были НЕ на поставленный вопрос. А на поставленный вопрос ответ совсем простой. Если я правильно вопрос понял, остатки уже получены. В вопросе также четко говорится фраза "на заданную дату", поэтому никакие max(Date) не нужны. Нужно отфильтровать ненулевые остатки. Это всего лишь select * from AnyTable where Rest>0. И все! Если автор вопроса подразумевал нечто другое, то и вопрос нужно ставить более четко. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2001, 20:21 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
Да, в вопрсе сказано, что нужны остатки на конкретную дату, но там же сказано, что текущий остаток заносится в таблицу только в том случае, если по счету была проводка, в противном случае необходимо выбирать остаток за предидущие даты. Всех благ, Александр. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2001, 05:28 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
Пока человеку совсем голову не задурили, напишу правильный ответ code: Но если много записей и желательно как-то ускорить время выполнения, то лучше последний запрос разбить на два и использовать временную таблицу: code: В любом случае нужен или вложенный запрос или временная таблица, т.е. простым одним select-ом не обойтись. Кто знает как можно по другому - напишите. Буду рад посмотреть. С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2001, 11:02 |
|
Выборка из таблицы остатков
|
|||
---|---|---|---|
#18+
ой блин, какая-то фигня получилась, хотел по-красивше ниписать. Должно было быть так: 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-ом не обойтись. Кто знает как можно по другому - напишите. Буду рад посмотреть. С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2001, 11:05 |
|
|
start [/forum/topic.php?fid=46&msg=32001625&tid=1827463]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 277ms |
total: | 404ms |
0 / 0 |