必须计算公式列并显示结果

时间:2017-09-04 08:20:18

标签: sql sql-server sql-server-2012

表格输入

IF OBJECT_ID('TEMPDB..#t1') IS NOT NULL
DROP TABLE #t1 
CREATE TABLE #t1
    ([a] int, [b] int, [c] varchar(100))
;

INSERT INTO #t1
    ([a], [b], [c])
VALUES
    (1, 2, 'a+b'),
    (5, 6, 'a*b'),
    (2, 1, 'a-b'),
    (3, 8, 'b/a')
;

select * from #t1

表格的结果

this note

预期产出

enter image description here

预期结果如上所示。 在表格中我们为每条记录都有一些列和公式,我们需要显示所有列,但在公式列而不是公式中我们需要根据公式列显示计算结果(此处为c)

注意 :我们需要这是动态的我们不知道我们需要使用公式column.formula不能是静态的公式< / p>

3 个答案:

答案 0 :(得分:1)

这是一个使用动态sql执行公式的简单方法:

CREATE TABLE #t1
(
    [a] INT,
    [b] INT,
    [c] VARCHAR(100)
);

INSERT INTO #t1
(
    [a],
    [b],
    [c]
)
VALUES
(5, 2, 'a*b');

DECLARE @cFormula AS NVARCHAR(20);

SELECT TOP 1
    @cFormula = c
FROM #t1;

DECLARE @sql AS NVARCHAR(50) = 
        N'SELECT TOP 1 a, b, ' + @cFormula + ' AS cResult FROM #t1 AS t';

EXECUTE sp_executesql @sql;

DROP TABLE #t1;

产地:

a   b   cResult
5   2   10 

这将适用于单行,因此您可以使用此方法和一些循环机制来迭代行,可能是游标。您没有提供任何其他列来显示您是否有可用于订购的ID或其他内容,因此请注意这一点。

答案 1 :(得分:0)

BEGIN TRAN
DECLARE @Strt INT ,@End INT 


IF OBJECT_ID('TEMPDB..#t1') IS NOT NULL
DROP TABLE #t1 
CREATE TABLE #t1
    ([a] int, [b] int, [c] varchar(100),[D] numeric(22,6))
;

INSERT INTO #t1
    ([a], [b], [c])
VALUES
    (1, 2, 'a+b'),
    (5, 6, 'a*b'),
    (2, 1, 'a-b'),
    (3, 8, 'b/a')

IF OBJECT_ID('TEMPDB..#TT') IS NOT NULL
DROP TABLE #TT
SELECT ROW_NUMBER()Over(Order by a)Rowno,* INTO #TT FROM #t1

SET @Strt =1
SELECT @End=MAX(Rowno)FROM #TT

    WHILE @Strt <=@END BEGIN

        DECLARE @Formula AS NVARCHAR(20),@sql NVARCHAR(MAX)

        SELECT @Formula = c 
        FROM  #TT WHERE Rowno = @Strt

        SET @sql=' 
                UPDATE #TT SET D ='+@Formula+'
                WHERE Rowno ='''+Convert(Nvarchar,@Strt)+''''
        PRINT @sql
        EXECUTE(@sql)

        SET @Strt= @Strt+1
    END

    SELECT * FROM #TT

ROLLBACK TRAN

答案 2 :(得分:-1)

只需使用CASE,因为选项不多

SELECT a, b, CASE
     WHEN c = 'a+b' or c = 'b+a' THEN a + b
     WHEN c = 'a-b' THEN a - b
     WHEN c = 'a*b' or c = 'b*a' THEN a * b
     WHEN c = 'a/b' THEN a / b
     WHEN c = 'b-a' THEN b - a
     WHEN c = 'b/a' THEN b / a
END c
FROM #t1

您可以使用CURSOR来获得更通用的解决方案

DECLARE c CURSOR FOR SELECT a, b, c FROM #t1;
DECLARE @v varchar(100)
DECLARE @a int
DECLARE @b int
DECLARE @sqlcmd varchar(8000)

OPEN c
FETCH NEXT FROM c INTO @a, @b, @v
SET @sqlcmd = 'SELECT ' + @v + ' FROM (SELECT CAST(' + CAST(@a as varchar) + ' AS DECIMAL(10,2)) as a, CAST(' + CAST(@b as varchar) + ' AS DECIMAL(10,2)) as b) t'
WHILE @@FETCH_STATUS = 0   
BEGIN   
    FETCH NEXT FROM c INTO @a, @b, @v
    IF (@@FETCH_STATUS <> 0) BREAK;
    SET @sqlcmd = @sqlcmd + (' UNION ALL SELECT ' + @v + ' FROM (SELECT CAST(' + CAST(@a as varchar) + ' AS DECIMAL(10,2)) as a, CAST(' + CAST(@b as varchar) + ' AS DECIMAL(10,2)) as b) t')
END   

PRINT @sqlcmd
EXEC (@sqlcmd)
CLOSE c   
DEALLOCATE c

demo