代码之家  ›  专栏  ›  技术社区  ›  So_oP

将temp表中的每个值传递给标量函数和求和值

  •  0
  • So_oP  · 技术社区  · 8 年前

    我有一个表值函数。在这个函数中,我有一个this代码

     DECLARE @totalPayment DECIMAL(18,4)
     DECLARE @totalPaymentConverted DECIMAL(18,4)
     DECLARE @fromCurrencyIdForPaymentSystemsId CHAR(3)
    
     DECLARE @GetTotalPaymentAmount AS TABLE 
     (
     Amount     DECIMAL(18,4),
     CurrencyId CHAR(3)
     )
    
    INSERT INTO @GetTotalPaymentAmount
    SELECT SUM(Amount),CurrencyId
    FROM [dbo].[fn_DepositWithdrawReport]()
    WHERE OperationTypeId = 2
    GROUP BY CurrencyId
    

    此insert return met表如下

     A      C
    -----|------
    550  |USD
    650  |EU
         |
    

    我想将每个值Amount和CurrencyId作为如下输入参数传递给标量值函数

    [dbo].[function_Valued](@totalPayment,@fromCurencyId,@toCurrencyId)
    

    比如,如果我们考虑上表

    [dbo].[functin_scalar](550,USD,EU)=450
    [dbo].[function_scalar](650,EU,EU)=650
    Get total 1100
    

    简单地说,我想计算总金额,我需要将其转换为一种货币。

    2 回复  |  直到 8 年前
        1
  •  2
  •   iSR5    8 年前

    首先,您需要阅读的答案 this post 更多了解表值函数和标量函数之间的差异,这将帮助您更好地了解哪种方法最适合您的情况。

    其次,我将发布一个简单的标量函数,您需要根据需要对其进行修改:

    CREATE FUNCTION TotalPayment 
    (
        @Amount         DECIMAL(18,4), 
        @FromCurrency   CHAR(3),
        @ToCurrency     CHAR(3)
    )
    RETURNS DECIMAL(18,4)
    AS
    BEGIN
    
        IF(@FromCurrency = 'USD' AND @ToCurrency = 'EUR')
        SET @Amount = @Amount * 0.803743
    
        IF(@FromCurrency = 'EUR' AND @ToCurrency = 'USD')
        SET @Amount = @Amount * 1.24418
    
        RETURN @Amount
    END
    GO
    

    该函数以欧元为基础货币,您可以将其更改为首选货币。此外,随着市场在这一问题上的涨跌,你需要保持汇率,因此你需要找到一种定期更新汇率的方法。除非你的数据库有这些数据。如果是这样,您可以从表中选择费率。

    提示:声明一个新的@param以从另一个表中获取货币汇率将非常有用。

    然后,可以使用简单的SELECT语句

    如果需要将所有行转换为EUR:

    SELECT
        Amount, 
        Currencyid, 
        dbo.TotalPayment(Amount, CurrencyId, 'EUR') AS ConvertedToEUR
    FROM  GetTotalPaymentAmount
    

    如果只想获取总金额(转换后):

    SELECT SUM(dbo.TotalPayment(Amount, CurrencyId, 'EUR')) AS TotalinEUR
    FROM  GetTotalPaymentAmount
    
        2
  •  0
  •   corky    8 年前

    你能做到这一点吗(最后):-

    SELECT [dbo].[function_scalar](TheSum, CurrencyId,EU) AS GrandTotal
    FROM (
    SELECT SUM(Amount) AS TheSum, CurrencyId
    FROM [dbo].[fn_DepositWithdrawReport]()
    WHERE OperationTypeId = 2
    GROUP BY CurrencyId)