powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Подскажите пож
23 сообщений из 23, страница 1 из 1
Подскажите пож
    #37874699
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть табличка

даты суммы флаг
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)
...
Рейтинг: 0 / 0
Подскажите пож
    #37874781
_ч_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
declare @t table(d datetime, s int, f int)

insert into @t(d, s, f)
select '2011-10-02', 5000, 1
union
select '2011-11-02', 4000, 1
union
select '2011-12-02', 5000, 1
union
select '2012-01-02', 20000, 2
union
select '2012-02-02', 6000, 1
union
select '2012-03-02', 8000, 1
union
select '2012-04-02', 5000, 2



select 
a.d, a.s, a.f, case when a.s+isnull(b.s, 0)>0 then a.d else GETDATE() end as [4th_row] 
from(
select ROW_NUMBER() over(order by d)as rn, d, case when f = 1 then -1*s else s end as s, f, s as ss from @t)a
left join(select ROW_NUMBER() over(order by d)as rn, case when f = 1 then -1*s else s end as s, f from @t)b on b.rn = a.rn-1



?
...
Рейтинг: 0 / 0
Подскажите пож
    #37874788
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну сделай, страдалец, ишо одну колонку "Накопительная сумма" и тебе существенно полегчает.
...
Рейтинг: 0 / 0
Подскажите пож
    #37874796
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_ч_
Код: sql
1.
2.
3.
4.
5.
select 
a.d, a.s, a.f, case when a.s+isnull(b.s, 0)>0 then a.d else GETDATE() end as [4th_row] 
from(
select ROW_NUMBER() over(order by d)as rn, d, case when f = 1 then -1*s else s end as s, f, s as ss from @t)a
left join(select ROW_NUMBER() over(order by d)as rn, case when f = 1 then -1*s else s end as s, f from @t)b on b.rn = a.rn-1




Вот нафега плохому учить?
...
Рейтинг: 0 / 0
Подскажите пож
    #37874814
_ч_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2,

Плохому это Row_Number()?
...
Рейтинг: 0 / 0
Подскажите пож
    #37874909
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_ч_
Member спасибо, но у меня что то на over жалуется
...
Рейтинг: 0 / 0
Подскажите пож
    #37874919
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--спасибо но пишет : некорректный синтаксис '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()
...
Рейтинг: 0 / 0
Подскажите пож
    #37874921
2000?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pitbullalex_ч_
Member спасибо, но у меня что то на over жалуется
версия поди 2000?
...
Рейтинг: 0 / 0
Подскажите пож
    #37874941
_ч_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pitbullalex,

Для начала лучше почитайте вот это:
http://www.sql.ru/forum/actualthread.aspx?tid=127456
...
Рейтинг: 0 / 0
Подскажите пож
    #37874993
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
результат запроса 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'.

или Вы не про это =)
...
Рейтинг: 0 / 0
Подскажите пож
    #37875015
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенести в другой форум (sybase ?). Здесь обсуждают Microsoft SQL Server.
...
Рейтинг: 0 / 0
Подскажите пож
    #37875080
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--ок,


--вот табличка последний столбец наверное не нужен, проабдейтить нужно 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".
...
Рейтинг: 0 / 0
Подскажите пож
    #37875385
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2 дал совершенно верный ответ.
Самое простое - вспомогательный столбец "накопительная сумма"

Используя скрипт из твоего последнего поста:
Код: sql
1.
update #qty2  set qty2=(select sum(case when CharType=1 then -qty1 else qty1 end) from #qty2 t2 where #qty2.operdate>=t2.operdate)



А потом просто выбираешь:
Код: sql
1.
2.
select * from #qty2
where qty2<0 and (select qty2 from #qty2 t2 where #qty2.operdate<t2.operdate having t2.operdate=min(t2.operdate) )>=0



И не дублируй топики пожалуйста.
...
Рейтинг: 0 / 0
Подскажите пож
    #37875403
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя если тебе нужно первая положительная сумма а не последняя отрицательная, то поменяй знаки:
Код: sql
1.
2.
select * from #qty2
where qty2>=0 and (select qty2 from #qty2 t2 where #qty2.operdate<t2.operdate having t2.operdate=max(t2.operdate) )<0



И учти что все это будет работать только если operdate уникальна.
...
Рейтинг: 0 / 0
Подскажите пож
    #37875800
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо огромное, только последний запрос не работает, я поменял с 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)
...
Рейтинг: 0 / 0
Подскажите пож
    #37875801
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати operdate уникально =)
...
Рейтинг: 0 / 0
Подскажите пож
    #37875833
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получилось так: находится первая сумма (я присваиваю дату,и обнуляю поле суммы), а вот дальше что то не могу понять, как следующую найти


вот что своял с вашей помощью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
...
Рейтинг: 0 / 0
Подскажите пож
    #37875845
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю ошибка здесть (ну я уверен)

Код: plaintext
1.
2.
3.
4.
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  q.operdate3 is not null
                   )
...
Рейтинг: 0 / 0
Подскажите пож
    #37875851
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, затупил
конечно здесь ошибка

and operdate3 is not null
...
Рейтинг: 0 / 0
Подскажите пож
    #37875891
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите меня чайника такого сделал

вот как


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
)
...
Рейтинг: 0 / 0
Подскажите пож
    #37875956
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишешь курсор с соотв. сортировкой и
бежишь по таблице, как увидел смену -- пишешь соотв. дату.
Просто, надёжно и быстро.
...
Рейтинг: 0 / 0
Подскажите пож
    #37876077
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на счет курсора (киньте ссылочку про это почитать)
и
вот последний вопрос, если сумма всегда была отрицательна, как бы выставить getdate() только это не работает
...
Рейтинг: 0 / 0
Подскажите пож
    #37876333
pitbullalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСЕ!!! Огромное всем спасибо за помощь, все решилось кому интересно
вот так сделал =)

update #qty2
set operdate3= getdate()
from #qty2
where qty2 is not null
and qty2 < 0
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Подскажите пож
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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