我有一个表值函数。在该函数中我有一个这个代码
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
简单地说我想要计算金额,我需要用一种货币转换它。
答案 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)