如何在SQL查询中从一列处理多种货币(精度和比例)

时间:2012-05-10 08:28:04

标签: sql sql-server sql-server-2008 tsql sql-server-2005

表格中有三列

TransactionDate---DateTime
TotalAmount---DECIMAL(18,4)
CurrencyCode---nVarchar(10)

TotalAmount-------------CurrencyCode
1000.5000----------------KD (Kuwaiti Dinnar) which must be 1000.500
5500.2000----------------ETB (Eithopian Birr)
2500.1500----------------USD (United States Dollars) which must be 2500.15

我将这些多种货币存储在一列......现在我希望通过在SQL查询中使用SUM()函数来获取每天或每月的报告............ 。必须根据每种货币的精确度或比例来完成SUM。 即.....如果货币是美元那么

SUM(2500.15)

如果货币是KD那么

SUM(1000.500)

如果ETB那么

SUM(5500.2000)

这样的事情......

4 个答案:

答案 0 :(得分:1)

您应该只将每种货币存储在可能的最小单位中,作为整数。

例如,如果您要存储美元,则应将该值存储为“便士数”,而不是精确值为2的十进制数。$ 1.00将变为100。

当您执行“SUM”时,您可能需要“按货币分组”才能使结果有意义。您的客户端软件需要知道如何正确显示每种货币,但不要让它干扰数据在数据库中的存储方式。

答案 1 :(得分:0)

使用一列无法实现,您应该使用三列 对于每种货币总和并相应地设定其精度,例如

    Select SUM(2500.15) as USD, SUM(1000.500) as KD, SUM(5500.2000) as ETB

答案 2 :(得分:0)

根据您的问题(模糊),您试图将货币转换为您的货币类型?

我认为这可能是您的示例数据的样子:

TransactionDate TotalAmount CurrencyCode
2012-06-01      12          KD
2012-06-01      25          KD
2012-06-01      55          ETB
2012-06-01       6          ETB
2012-06-01      13          USD
2012-06-01      10          USD

你要完成的逻辑是ex。如果CurrencyCode = KD则求和(TotalAmount)*转换率(假设您所列出的数字是)

查询:

Select
  sum(
    case when [CurrencyCode] = 'KD' then [TotalAmount]*1000.500 
        when [CurrencyCode] = 'ETB' then [TotalAmount]*5500.2000 
        when [CurrencyCode] = 'USD' then [TotalAmount]*2500.1500 
        else 0 end) as [TotalCalcAmount]
From [SomeTable]
--Where [TransactionDate] between '2012-06-01' and '2012-06-30' --Commented out for test purposes

SQLFiddle与解释:http://sqlfiddle.com/#!3/ade6e/3

答案 3 :(得分:0)

SELECT CurrencyCode, SUM(TotalAmount)
FROM dbo.your_table
GROUP BY CurrencyCode