here's the full illustration for your example
declare @tableA table
(
[ID] int,
[COL1] int,
[COL2] int,
[COL3] int
)
insert @tableA
values(1, 100, 110, 150),
(2, 90, 100, 120),
(3, 75, 85, 110)
declare @tableB table
(
[ID] int,
[COLUMNS] varchar(10),
[CO] decimal(5,1),
[EQ] int
)
insert @tableB
values(1, 'COL1', 0.2, 100),
(2, 'COL2', 0.5, 110),
(3, 'COL3', 0, 90)
;With CTE1
AS
(
SELECT *
FROM @tableA t
UNPIVOT( [Val] FOR [COLUMNS] IN ([COL1],[COL2],[COL3]))u
),
CTE2
AS
(
SELECT ID,CAST(Val AS float) AS Val,COLUMNS
FROM CTE1 c1
WHERE NOT EXISTS(SELECT 1 FROM CTE1 WHERE ID < c1.ID)
UNION ALL
SELECT c1.ID,CAST(c1.Val + (c2.Val * b.CO) AS float),c1.COLUMNS
FROM CTE2 c2
INNER JOIN CTE1 c1
ON c1.ID = c2.ID + 1
AND c1.COLUMNS=c2.COLUMNS
INNER JOIN @tableB b
ON b.COLUMNS=c2.COLUMNS
)
SELECT *
FROM CTE2
PIVOT(SUM(Val) FOR COLUMNS IN ([COL1],[COL2],[COL3]))p
output
----------------------------------------------
ID COL1 COL2 COL3
1 100 110 150
2 110 155 120
3 97 162.5 110
------------------------------------------------------------------------------------------------------
SQL Server MVP
http://visakhm.blogspot.com/