|
Подскажите пож
|
|||
---|---|---|---|
#18+
есть табличка даты суммы флаг 2.10.11 5000 1 2.11.11 4000 1 2.12.11 5000 1 2.01.12 20000 2 2.02.12 6000 1 2.03.12 8000 1 2.04.12 5000 2 2.04.12 5000 2 2.04.12 5000 2 *флаг - 1 - это значит минус 2 - это значит плюс нужно сделать что бы в 4-й столбец вытягивалась дата когда переменная ссумы с минуса менялась на плюс( >= 0 ) *если вконце ссумма так и не поменялась в плюс то getdate() (сегодняшняя дата) даты суммы флаг Дата когда сумма >=0 2.10.11 5000 1 2.01.12 2.11.11 4000 1 2.01.12 2.12.11 5000 1 2.01.12 2.01.12 20000 2 2.01.12 * @сумма =-5000-4000-5000+20000 = 1000(больше либо равна 0) 2.02.12 6000 1 2.04.12 2.03.12 8000 1 2.04.12 2.04.12 5000 2 2.04.12 2.04.12 5000 2 2.04.12 2.04.12 5000 2 2.04.12 * @сумма =@сумма(то есть 1000) -6000-8000+5000+5000+5000 = 3000(больше либо равна 0) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 12:48 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
pitbullalex, Код: 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.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 13:20 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Ну сделай, страдалец, ишо одну колонку "Накопительная сумма" и тебе существенно полегчает. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 13:22 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
_ч_ Код: sql 1. 2. 3. 4. 5.
Вот нафега плохому учить? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 13:24 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
aleks2, Плохому это Row_Number()? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 13:31 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
_ч_ Member спасибо, но у меня что то на over жалуется ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:12 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
--спасибо но пишет : некорректный синтаксис 'over' --я просто про ROW_NUMBER() первый раз слышу........... --я пока Вас ждал вот что натворил: --@Chartype ---это флаг (из таблички) --@qty3 -- это переменная суммы --operdate3 --это дата declare @qty3 money, @datafact smalldatetime ,@Chartype DSTINYINT select @qty3 = 0 select @datafact = min(operdate3) from #qty2 while @datafact is not null begin select @Chartype = isnull((select chartype from #qty2 where 1=1 and operdate3=@datafact),0) if @CharType = 1 begin select @qty3=@qty3-(select qty1 from #qty2 where 1=1 and operdate3=@datafact) end if @CharType = 2 begin select @qty3=@qty3+(select qty1 from #qty2 where 1=1 and operdate3=@datafact) end update #qty2 set operdate3 = '19000101' where operdate3 = @datafact select @datafact = min(operdate3) from #qty2 where operdate3 <> '19000101' end --но мне еще много придется думать? или нет? --я просто вашу логику не до конца понял ну щас почитаю про ROW_NUMBER() ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:19 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
pitbullalex_ч_ Member спасибо, но у меня что то на over жалуется версия поди 2000? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:19 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
pitbullalex, Для начала лучше почитайте вот это: http://www.sql.ru/forum/actualthread.aspx?tid=127456 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:24 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
результат запроса select @@version. Adaptive Server Enterprise/12.5.4/EBF 14934 ESD#7/P/x86_64/Enterprise Linux/ase1254/2093/64-bit/OPT/Thu Oct 11 03:20:54 2007 механизм доступа клиента к серверу DBArtisan 8.1.0 скопировал ваш запрос, нажимаю на выполнение : и пишет: 16:45:08.477 DBMS khmb3 -- Error: Number (156) Severity (15) State (2) Server (khmb2) Incorrect syntax near the keyword 'over'. или Вы не про это =) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:48 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Перенести в другой форум (sybase ?). Здесь обсуждают Microsoft SQL Server. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 14:58 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
--ок, --вот табличка последний столбец наверное не нужен, проабдейтить нужно operdate3 create table #qty2 ( qty1 money ,operdate DSOPERDAY ,operdate3 DSOPERDAY ,CharType DSTINYINT ,qty2 money ) insert into #qty2 ( qty1 ,operdate ,operdate3 ,CharType ,qty2 ) select 8370.00, '20101020', '20101020', 1, 0.00 union select 8370.00, '20101122', '20101122', 1,0.00 union select 8370.00, '20101220', '20101220', 1, 0.00 union select 8370.00, '20110120', '20110120', 1, 0.00 union select 8370.00, '20110221', '20110221', 1, 0.00 union select 8370.00, '20120820','20120820', 1, 0.00 union select 8370.00, '20120920','20120920', 1, 0.00 union select 8370.00, '20101123','20101123', 2, 0.00 union select 8370.00, '20101220','20101220', 2, 0.00 union select 8370.00, '20110118', '20110118', 2, 0.00 union select 1460.36, '20110620','20110620' , 2, 0.00 union select 15000.00, '20110718','20110718', 2, 0.00 union select 15000.00, '20110822','20110822', 2, 0.00 union select 15000.00, '20110917','20110917', 2, 0.00 union select 15000.00, '20111017','20111017', 2, 0.00 union select 40000.27, '20120713','20120713', 2, 0.00 union select 6652.69, '20100720','20100720', 1, 0.00 union select 6652.69, '20101018','20101018', 2, 0.00 union select 1623350.00, '20110303','20110303', 1, 0.00 select * from #qty2 order by operdate Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 15:28 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
aleks2 дал совершенно верный ответ. Самое простое - вспомогательный столбец "накопительная сумма" Используя скрипт из твоего последнего поста: Код: sql 1.
А потом просто выбираешь: Код: sql 1. 2.
И не дублируй топики пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 17:56 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Хотя если тебе нужно первая положительная сумма а не последняя отрицательная, то поменяй знаки: Код: sql 1. 2.
И учти что все это будет работать только если operdate уникальна. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2012, 18:05 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Спасибо огромное, только последний запрос не работает, я поменял с max на min он выдает 1-ое(первое) положительное число,а нужно все (которые поменялись с минуса на плюс) operdate3 изменить так как ниже описано вот так: даты ___ суммы _ флаг ___ operdate3 когда сумма >=0 2.10.11__5000_____1_____2.11.11 * -5000+20000 = 15000(больше либо равна 0) 2.11.11_20000_____2_____2.11.11 * -5000+20000 = 15000(больше либо равна 0) 2.02.12_16000_____1_____2.04.12 * (то есть 15000) -16000-8000+5000+5000= 1000(больше либо равна 0) 2.04.12_5000______2_____2.04.12 * (то есть 15000) -16000-8000+5000+5000= 1000(больше либо равна 0) 2.04.12_5000______2_____2.04.12 * (то есть 15000) -16000-8000+5000+5000= 1000(больше либо равна 0) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 07:50 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
кстати operdate уникально =) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 07:51 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
получилось так: находится первая сумма (я присваиваю дату,и обнуляю поле суммы), а вот дальше что то не могу понять, как следующую найти вот что своял с вашей помощьюupdate #qty2 set qty2=(select sum(case when CharType=1 then -qty1 else qty1 end) from #qty2 t2 where #qty2.operdate>=t2.operdate) declare @datafact smalldatetime select @datafact = (select min(q.operdate) from #qty2 q where q.qty2>=0 and (select t2.qty2 from #qty2 t2 where q.operdate<t2.operdate having t2.operdate=min(t2.operdate) )<0 ) while @datafact is not null--<> '19000101' begin update #qty2 set operdate3=@datafact ,qty2 = null where operdate <= @datafact and operdate3 is not null select @datafact = (select min(q.operdate3) from #qty2 q where q.qty2>=0 and (select t2.qty2 from #qty2 t2 where q.operdate3<t2.operdate3 having t2.operdate3=min(t2.operdate3) )<0 and operdate3 is not null ) end select * from #qty2 order by operdate ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 08:40 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Я думаю ошибка здесть (ну я уверен) Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 08:49 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
извините, затупил конечно здесь ошибка and operdate3 is not null ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 08:51 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Простите меня чайника такого сделал вот как select @datafact = (select min(q.operdate) from #qty2 q where q.qty2>=0 and q.qty2 is not null and operdate > @datafact -- and (select t2.qty2 from #qty2 t2 where q.operdate<t2.operdate and q.operdate<> '' having t2.operdate=min(t2.operdate) ) -- <0 ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 09:13 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
Пишешь курсор с соотв. сортировкой и бежишь по таблице, как увидел смену -- пишешь соотв. дату. Просто, надёжно и быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 09:50 |
|
Подскажите пож
|
|||
---|---|---|---|
#18+
а на счет курсора (киньте ссылочку про это почитать) и вот последний вопрос, если сумма всегда была отрицательна, как бы выставить getdate() только это не работает ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2012, 10:44 |
|
|
start [/forum/topic.php?fid=55&fpage=14&tid=2010104]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 236ms |
total: | 388ms |
0 / 0 |