Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
Здравствуйте!

Возможно ли реализовать данную формулу при помощи запроса (циклы и курсоры не предлагать)?

Формула: Rn = (An*Rn-1 + Cn)/(An + Bn)

Пример: n=3

DECLARE @tResult TABLE(Id INT IDENTITY(1,1), A money, B money, C money)

INSERT @tResult
VALUES(0, 100, 847.46)

INSERT @tResult
VALUES(40, 180, 1559.15)

INSERT @tResult
VALUES(45, 5, 29.66)


На выходе нужно получить:

ID A B C R
1 0 100 847,46 8,47
2 40 180 1559,15 8,63
3 45 5 29,66 8,36
10 авг 12, 14:15    [12993809]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
https://www.sql.ru/faq/faq_topic.aspx?fid=125
10 авг 12, 14:19    [12993831]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
invm, обычный нарастающий итог не подходит, к сожалению для данной формулы ((
10 авг 12, 14:24    [12993876]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
vvsche
обычный нарастающий итог не подходит, к сожалению для данной формулы

Почему, если для расчета текущего Rn используется Rn-1 ?
10 авг 12, 14:25    [12993885]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
Glory, вот пример:
1. 847.46/100 = 8.47
2. (847.46/100 * 40 + 1559.15)/(40 + 180)
3. ((847.46/100 * 40 + 1559.15)/(40 + 180))*45 + 29.66)/(45 + 5)

и данный случай никак не попадает под запрос нарастающим итогом

select	r1.id,
	r1.o,
	r1.a,
	r1.b,
              r1.c,
	R = ?
from	@tResult r1
	left join @tResult r2 on r1.id >= r2.id
group by
	r1.id,
	r1.o,
	r1.a,
	r1.b,
              r1.c
10 авг 12, 14:37    [12994014]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
мимо
Guest
DECLARE @tResult TABLE(Id INT IDENTITY(1,1), A money, B money, C money)

INSERT @tResult
VALUES(0, 100, 847.46)

INSERT @tResult
VALUES(40, 180, 1559.15)

INSERT @tResult
VALUES(45, 5, 29.66)


; with a  as
(
select *
,(t.A + t.C)/(t.A + t.B) as rn
from @tResult as t
Where t.id = 1
union all
select t.*
,(t.A*a.rn  + t.C)/(t.A + t.B) as rn
from @tResult as t
inner join a on (a.id = t.Id - 1)
)
select *
from a
10 авг 12, 14:39    [12994038]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
vvsche
Glory, вот пример:
1. 847.46/100 = 8.47
2. (847.46/100 * 40 + 1559.15)/(40 + 180)
3. ((847.46/100 * 40 + 1559.15)/(40 + 180))*45 + 29.66)/(45 + 5)

и данный случай никак не попадает под запрос нарастающим итогом

select	r1.id,
	r1.o,
	r1.a,
	r1.b,
              r1.c,
	R = ?
from	@tResult r1
	left join @tResult r2 on r1.id >= r2.id
group by
	r1.id,
	r1.o,
	r1.a,
	r1.b,
              r1.c


т.е. в этом-то у меня и проблема, не могу прапвильно расписать в запрос значение R.
10 авг 12, 14:41    [12994068]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
мимо, спасибо большое.
10 авг 12, 14:44    [12994103]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
А возможно ли реализовать без использования CTE?
11 авг 12, 01:30    [12997213]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
vvsche,

У вас я так понял явная функциональная зависимость. Рекурсивное СТЕ очень подходит. Еще возможно циклом. А зачем вам это? Чем не устраивает предложенный вариант?
11 авг 12, 01:48    [12997233]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
vvsche
Member

Откуда:
Сообщений: 7
SomewhereSomehow, тем что мне нужно теперь этот механизм перенести в 1С-й запрос, в котором нет аналога СТЕ. Поэтому и задал последний вопрос.
11 авг 12, 02:22    [12997270]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с запросом  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
vvsche,

Не понял, что значит в 1С нет аналога СТЕ, вы собрались возложить на 1С выполнение запросов? Это ведь клиент...
Если вы имеете ввиду что 1С крутится на сервере версии < 2005, когда еще не было сте, то, ну не знаю... наверное делайте процедуру в ней цикл, в цикле высчитывайте это эначение, еще вот так можно попробовать, но я не помню, хавает ли такое 2000-ый или нет:
DECLARE @tResult TABLE(Id INT IDENTITY(1,1), A money, B money, C money, R money default 0)

INSERT @tResult
VALUES(0, 100, 847.46,0)
INSERT @tResult
VALUES(40, 180, 1559.15,0)
INSERT @tResult
VALUES(45, 5, 29.66,0)

declare @r money;
set @r = 0;

update @tResult
set
	@r = r = (A*@r + C)/(A + B)
	
select * from @tResult

И также не помню, что там насчет порядка, по-моему он не гарантируется. Говорят что можно поставить OPTION (FORCE ORDER) и увеличить вероятность правильного порядка, но все равно гарантий нет.
11 авг 12, 12:14    [12997540]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить