将每个值从临时表传递到标量函数和总和值

时间:2018-01-26 11:53:22

标签: sql sql-server database tsql

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

 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

此插入返回符合此表的表格

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

我想将这些值Amount和CurrencyId中的每一个传递给Scalar值作为输入参数,如下所示

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

如果我们考虑上面的表格

,请对该值求和
[dbo].[functin_scalar](550,USD,EU)=450
[dbo].[function_scalar](650,EU,EU)=650
Get total 1100

简单地说我想要计算金额,我需要用一种货币转换它。

2 个答案:

答案 0 :(得分:2)

首先,您需要阅读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

答案 1 :(得分:0)

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

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)