Reputation: 45
I have a table like this
Formular | A | B | C | ....
----------------------------------------
(A + B) | 5 | 10 | 8 | ....
(B + C) | 8 | 5 | 1 | ....
(A - Y) | 10 | 0 | 9 | ....
(A + Z) | 2 | 0 | 0 | ....
How can i select to get new table like below
Formular | A | B | C | ....| ToTal
----------------------------------------
(A + B) | 5 | 10 | 8 | ....| 15
(B + C) | 8 | 5 | 1 | ....| 6
(A - C) | 10 | 0 | 9 | ....| 1
(A + Z) | 10 | 0 | 9 | ....| ...
The ...
mean it can have many column and very dynamic
Thanks you very much!
Upvotes: 1
Views: 84
Reputation: 69504
If you already have a primary key column in your table, skip the steps where I have added a row_number to rows and use your primary key column instead the rest should be the same.
CREATE TABLE Formulas (Formular VARCHAR(10), A INT , B INT , C INT)
GO
INSERT INTO Formulas VALUES
('(A + B)' , 5 , 10 , 8 ),
('(B + C)' , 8 , 5 , 1 ),
('(A - C)' , 10 , 0 , 9 ),
('(A + C)' , 10 , 0 , 9 )
GO
Select *
,ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) rn
,0 AS Total
INTO ##Temp
FROM Formulas
ALTER TABLE ##Temp
ADD [SQL] NVARCHAR(MAX)
GO
UPDATE ##Temp
SET [SQL] = 'Select @Total = ' + Formular + ' FROM ##Temp WHERE rn = @RowNumber'
GO
Declare @Sql NVARCHAR(MAX) , @RowNumber INT, @Total INT
Declare Cur CURSOR FOR
SELECT rn , [SQL]
FROM ##Temp
OPEN Cur
FETCH NEXT FROM Cur INTO @RowNumber , @Sql
WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
,N'@RowNumber INT, @Total INT OUTPUT'
,@RowNumber
,@Total OUTPUT
Select @Total , @Total
UPDATE ##Temp SET Total = @Total WHERE rn = @RowNumber
FETCH NEXT FROM Cur INTO @RowNumber , @Sql
END
CLOSE Cur
DEALLOCATE Cur
Select Formular, A , B, C, Total
from ##Temp
╔══════════╦════╦════╦═══╦═══════╗
║ Formular ║ A ║ B ║ C ║ Total ║
╠══════════╬════╬════╬═══╬═══════╣
║ (A + B) ║ 5 ║ 10 ║ 8 ║ 15 ║
║ (B + C) ║ 8 ║ 5 ║ 1 ║ 6 ║
║ (A - C) ║ 10 ║ 0 ║ 9 ║ 1 ║
║ (A + C) ║ 10 ║ 0 ║ 9 ║ 19 ║
╚══════════╩════╩════╩═══╩═══════╝
Upvotes: 1