在 SQL 查询中添加货币



我正在使用一个 Oracle 数据库,我有这两个表:

  • Space(id_space (PK(, 区域, 类型 (FK((
  • Offer(id_space(FK(、卖出、价格、货币(

我需要找到每个区域中空间的最低和最高价格,并且我有不同货币的空间,我需要一些帮助,我应该在哪里包含它,以便可以比较和找到最低的,例如 100 欧元和 100 美元。 我需要的类型是"11",卖出需要是"N"。

货币可以有值:"EUR","USD",简单的转换也可以,例如 1EUR=1.11USD

这是我到目前为止尝试过的:

SELECT s.zone, MIN(o.price),MAX(o.price)
FROM Offer o JOIN Space s ON s.id_space=o.id_space
WHERE s.type=11 AND o.sell='N'
GROUP BY   s.zone

这是输出

+------+--------------+--------------+
| Zone | MIN(o.price) | MAX(o.price) |
+------+--------------+--------------+
| 1    | 80           |          478 |
+------+--------------+--------------+
| 2    | 100          |          100 |
+------+--------------+--------------+
| 3    | 100          |          150 |
+------+--------------+--------------+

但是在最后一行,100 是欧元,150 是美元,我有一个 140 欧元的女巫超过 150 美元。 有人知道吗?

汇率会发生变化,如果您想避免每次汇率变化时都修改每个报告查询,则必须将汇率存储在表中。

最简单的方法是有一个 ExchangeRates 表,其中包含存储货币和"基础"货币之间的汇率。假设基础货币为美元:

Create Table ExchangeRates(Currency char(3),Rate decimal(5,3));
Insert into ExchangeRates(Currency,Rate)
Values
('USD',1)  -- The base currency
('EUR',1.11),
('GBP',1.32),
('INR',0.014) -- XRs don't have just two decimals

查询只需要联接到 XR 表:

SELECT s.zone, 
MIN(o.price*xr.Rate),
MAX(o.price*xr.Rate)
FROM Offer o JOIN Space s ON s.id_space=o.id_space
INNER JOIN ExchangeRates xr on o.Currency=xr.Currency
WHERE s.type=11 AND o.sell='N'
GROUP BY   s.zone

您可以使用CASE表达式根据货币确定汇率系数。

例如,如果您的结果应该以€为单位,假设您只有€和$两种货币:

SELECT s.zone,
min(o.price
* CASE o.currency
WHEN 'EUR' THEN
1
WHEN 'USD' THEN
.9
END),
max(o.price
* CASE o.currency
WHEN 'EUR' THEN
1
WHEN 'USD' THEN
.9
END)
FROM offer o
INNER JOIN space s
ON s.id_space = o.id_space
WHERE s.type = 11
AND o.sell = 'N'
GROUP BY s.zone;

最新更新