keuri(1+(wac_inc/100))不是您想要乘以聚合的因子吗?这将是EXP(SUM(LOG((1+(wac_inc/100‘‘)))@GiorgiNakeuri,我为SQL Server 2012添加了一个完整的工作解决方案,使用了这个技巧。同样
keuri(1+(wac_inc/100))不是您想要乘以聚合的因子吗?这将是EXP(SUM(LOG((1+(wac_inc/100‘‘)))@GiorgiNakeuri,我为SQL Server 2012添加了一个完整的工作解决方案,使用了这个技巧。同样,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,keuri(1+(wac_inc/100))不是您想要乘以聚合的因子吗?这将是EXP(SUM(LOG((1+(wac_inc/100‘‘)))@GiorgiNakeuri,我为SQL Server 2012添加了一个完整的工作解决方案,使用了这个技巧。同样的技巧也适用于所有基于集合的变量,用于计算运行总计,包括非递归CTE,例如自联接。@GiorgiNakeuri,这里没有递归。我只是将基线与主数据联合起来,为它提供一个运行总数的起点。在EDIT1下的SQL Server 2012的第二个解决方
keuri(1+(wac_inc/100))不是您想要乘以聚合的因子吗?这将是
EXP(SUM(LOG((1+(wac_inc/100‘‘)))
@GiorgiNakeuri,我为SQL Server 2012添加了一个完整的工作解决方案,使用了这个技巧。同样的技巧也适用于所有基于集合的变量,用于计算运行总计,包括非递归CTE,例如自联接。@GiorgiNakeuri,这里没有递归。我只是将基线与主数据联合起来,为它提供一个运行总数的起点。在EDIT1下的SQL Server 2012的第二个解决方案中,您可以使用主数据连接基线,这可能比此联合更好,因为它应该能够更有效地使用索引。MyUNION
变体可能需要额外排序。有必要检查执行计划。对不起,当我看到union时,我所做的只是递归,没有注意到cte上没有连接。
ID wac_inc item
-- ----------------- ----
1 2.310000000000000 A
2 1.100000000000000 A
3 2.130000000000000 A
4 1.340000000000000 A
item baseline
---- ------------------
A 10.000000000000000
ID wac_inc item Running_Mul
-- ----------------- ---- -----------
1 2.310000000000000 A 10.231 -- 10 * (1+(2.310000000000000/100))
2 1.100000000000000 A 10.343541 -- 10.231 * (1+(1.100000000000000/100))
3 2.130000000000000 A 10.563858 -- 10.343541 * (1+(2.130000000000000/100))
4 1.340000000000000 A 10.705413 -- 10.563858 * (1+(1.340000000000000/100))
DECLARE @t TABLE
(
ID INT ,
wac DECIMAL(30, 10) ,
item CHAR(1)
)
DECLARE @b TABLE
(
item CHAR(1) ,
baseline DECIMAL(30, 10)
)
INSERT INTO @t
VALUES ( 1, 2.31, 'A' ),
( 2, 1.10, 'A' ),
( 3, 2.13, 'A' ),
( 4, 1.34, 'A' )
INSERT INTO @b
VALUES ( 'A', 10 );
WITH ordercte
AS ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY item ORDER BY ID ) AS rn
FROM @t
),
rec
AS ( SELECT t.item ,
t.ID ,
t.wac ,
t.rn ,
b.baseline * ( 1 + ( t.wac / 100 ) ) AS m
FROM ordercte t
JOIN @b b ON b.item = t.item
WHERE t.rn = 1
UNION ALL
SELECT t.item ,
t.ID ,
t.wac ,
t.rn ,
c.m * ( 1 + ( t.wac / 100 ) )
FROM ordercte t
JOIN rec c ON t.item = c.item
AND t.rn = c.rn + 1
)
SELECT id ,
wac ,
item ,
m
FROM rec
id wac item m
1 2.3100000000 A 10.231000
2 1.1000000000 A 10.343541
3 2.1300000000 A 10.563858
4 1.3400000000 A 10.705414
WITH ordercte
AS ( SELECT t.ID ,
t.wac ,
t.item ,
b.baseline ,
ROW_NUMBER() OVER ( PARTITION BY t.item ORDER BY ID ) AS rn
FROM @t t
JOIN @b b ON b.item = t.item
)
SELECT baseline
* EXP(SUM(LOG(( 1 + ( wac / 100 ) ))) OVER ( PARTITION BY item ORDER BY rn )) AS m
FROM ordercte
SELECT t.ID, t.wac, t.item, baseline
* EXP(SUM(LOG(( 1 + ( wac / 100 ) ))) OVER ( PARTITION BY t.item ORDER BY t.ID )) AS m
FROM @t t
JOIN @b b ON b.item = t.item
ID wac item m
1 2.3100000000 A 10.231
2 1.1000000000 A 10.343541
3 2.1300000000 A 10.5638584233
4 1.3400000000 A 10.7054141261722
WITH cte
AS ( SELECT t.ID ,
t.wac ,
t.item ,
baseline ,
( SELECT SUM(LOG(( 1 + ( wac / 100 ) )))
FROM @t it
WHERE it.item = t.item AND it.ID <= t.ID
) AS e
FROM @t t
JOIN @b b ON b.item = t.item
)
SELECT ID, wac, item, baseline * EXP(e) AS m
FROM cte
WITH cte
AS ( SELECT t.ID ,
t.wac ,
t.item ,
b.baseline ,
ca.e,
ca.n,
ca.m
FROM @t t
JOIN @b b ON b.item = t.item
CROSS APPLY(SELECT SUM(LOG(ABS(NULLIF( 1 + wac / 100 , 0)))) as e,
SUM(SIGN(CASE WHEN 1 + wac / 100 < 0 THEN 1 ELSE 0 END)) AS n,
MIN(ABS(1 + wac / 100)) AS m
FROM @t it
WHERE it.item = t.item AND it.ID <= t.ID
) ca
)
SELECT ID, wac, item, baseline *
CASE
WHEN m = 0 THEN 0
WHEN n % 2 = 1 THEN -1 * EXP(e)
ELSE EXP(e)
END as Result
FROM cte
with rec(id ,wi,i,r) as
(
select top (1) w.ID,w.wac_inc,w.item, b.baseline * (1 + (w.wac_inc/100))
from wac w join baseline b on w.item=b.item
union all
select w.ID,w.wac_inc,w.item, r.r * (1 + (w.wac_inc/100))
from wac w
join rec r on (w.ID)-1 = r.id
)
select * from rec
1 2.31 A 10.231
2 1.1 A 10.343541
3 2.13 A 10.563858
4 1.34 A 10.705414
create table wac
(ID int,wac_inc numeric(38,15),item char )
insert wac
values (1,2.31,'A'),
(2,1.1,'A'),
(3,2.13,'A'),
(4,1.34,'A')
create table #tmp (ID int,wac_inc numeric(38,15),item char, Running_Mul numeric(38,15))
insert into #tmp select id,wac_inc,item,null from wac
update #tmp set Running_Mul = (select top 1 baseline from baseline)*(1+(wac_inc/100))
where id = (select min(id) from #tmp)
declare @id int,@rm numeric(38,15)
select @id=min(id) from #tmp
select @rm=Running_Mul from #tmp where id=@id
update #tmp
set @rm=Running_Mul= case
when @id <> id then @rm*(1+(wac_inc/100))
else Running_Mul
end,
@id=id
select * from #tmp
drop table #tmp
ID wac_inc item Running_Mul
1 2.310000000000000 A 10.231000000000000
2 1.100000000000000 A 10.343541000000000
3 2.130000000000000 A 10.563858000000000
4 1.340000000000000 A 10.705414000000000
exp(log(a) + log(b)) = a * b
SELECT SUM(val) AS [Sum], EXP(SUM(LOG(val))) AS Product
FROM (VALUES
(1), (2), (3), (4)
) x(val)
WITH
CTE
AS
(
SELECT
0 AS ID
,item
,baseline AS wac_inc
,baseline AS m
FROM baseline
UNION ALL
SELECT
ID
,item
,wac_inc
,1 + wac_inc/100 AS m
FROM wac
)
SELECT
ID
,item
,wac_inc
,m
,EXP(SUM(LOG(m)) OVER (PARTITION BY item ORDER BY ID ROWS UNBOUNDED PRECEDING)) AS MulRows
FROM CTE;
ID item wac_inc m MulRows
0 A 10.000000000000000 10.000000000000000 10
1 A 2.310000000000000 1.023100000000000 10.231
2 A 1.100000000000000 1.011000000000000 10.343541
3 A 2.130000000000000 1.021300000000000 10.5638584233
4 A 1.340000000000000 1.013400000000000 10.7054141261722