Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Подскажите пож / 23 сообщений из 23, страница 1 из 1
11.07.2012, 12:48
    #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
11.07.2012, 13:20
    #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
11.07.2012, 13:22
    #37874788
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите пож
Ну сделай, страдалец, ишо одну колонку "Накопительная сумма" и тебе существенно полегчает.
...
Рейтинг: 0 / 0
11.07.2012, 13:24
    #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
11.07.2012, 13:31
    #37874814
_ч_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите пож
aleks2,

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

Для начала лучше почитайте вот это:
http://www.sql.ru/forum/actualthread.aspx?tid=127456
...
Рейтинг: 0 / 0
11.07.2012, 14:48
    #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
11.07.2012, 14:58
    #37875015
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите пож
Перенести в другой форум (sybase ?). Здесь обсуждают Microsoft SQL Server.
...
Рейтинг: 0 / 0
11.07.2012, 15:28
    #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
11.07.2012, 17:56
    #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
11.07.2012, 18:05
    #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
12.07.2012, 07:50
    #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
12.07.2012, 07:51
    #37875801
pitbullalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите пож
кстати operdate уникально =)
...
Рейтинг: 0 / 0
12.07.2012, 08:40
    #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
12.07.2012, 08:49
    #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
12.07.2012, 08:51
    #37875851
pitbullalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите пож
извините, затупил
конечно здесь ошибка

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

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


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