【问题标题】:Evaluate user define formula (id, column) with SQL使用 SQL 评估用户定义公式(id、列)
【发布时间】:2021-07-30 06:05:21
【问题描述】:

我在 SQL Server 中有 2 个表,其中

DECLARE @Formulas TABLE (ID int, Calculation varchar(max)) 

INSERT INTO @Formulas 
VALUES (1, '([445660][SOLDE]+[401000][DEBIT]-[380100][CREDIT])')
DECLARE @Values TABLE (ValueID int, Solde money, Debit money, Credit money)

INSERT INTO @Values 
VALUES (445660, 2500, 5500, 3000),
       (401000, 0, 2500, 0),
       (380100, 0, 0, 3500.24)
DECLARE @SQL varchar(max)=''

SELECT @SQL = @SQL+concat(',(',ID,',',Calculation,')') From @Formulas --Where ID=2

SELECT @SQL = Replace(@SQL,'['+cast(ValueID as varchar(25))+']',/[Value]/) From @Values

SELECT @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'

EXEC(@SQL)

3 代码中的 /[Value]/ 必须更改为列(Solde, Debit, Credit),因为我有 3 列,用户可以选择其中任何一个。

我举个例子 Calculating/Evaluate user defined formula with SQL 但它是单列

提前致谢。

【问题讨论】:

    标签: sql sql-server tsql dynamic-sql


    【解决方案1】:

    也许这会有所帮助。 (认为​​代码看起来很熟悉)

    这里我们使用CROSS APPLYUNPIVOT 的值表创建MapFromMapTo

    Declare @Formulas table (ID int,Calculation varchar(max)) 
    Insert Into @Formulas values
    (1,'([445660][SOLDE]+[401000][DEBIT]-[380100][CREDIT])')
    
    Declare @Values table (ValueID int,Solde money,Debit money,Credit money)
    Insert Into @Values values
    (445660,2500,5500,3000),
    (401000,0,2500,0),
    (380100,0,0,3500.24)
    
    Declare @SQL varchar(max)=''
    Select  @SQL = @SQL+concat(',(',ID,',',Calculation,')') From @Formulas --Where ID=2
    Select  @SQL = Replace(@SQL,MapFrom,MapTo) 
      From  @Values A 
      Cross Apply (values ( concat('[',ValueID,'][SOLDE]' ),concat('',Solde))
                         ,( concat('[',ValueID,'][DEBIT]' ),concat('',Debit))
                         ,( concat('[',ValueID,'][CREDIT]'),concat('',Credit))
            ) B(MapFrom,MapTo)
    Select  @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'
    Exec(@SQL)
    

    结果

    ID  Value
    1   1499.76
    

    【讨论】:

    • @MohammedFETTAH 你熟悉接受答案吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多