Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL查询中添加货币_Sql_Oracle - Fatal编程技术网

在SQL查询中添加货币

在SQL查询中添加货币,sql,oracle,Sql,Oracle,我使用的是Oracle数据库,我有以下两个表: 空间(标识空间(PK)、分区、类型(FK)) 报价(标识空间(FK)、销售、价格、货币) 我需要找到每个区域空间的最低和最高价格,我有不同货币的空间,我需要一些帮助,我应该在哪里包括这些,以便能够比较和找到最低价格,例如100欧元和100美元。 我需要的类型是“11”,销售需要是“N” 货币可以有‘欧元’、‘美元’等值,简单的换算也可以,比如1EUR=1.11USD 以下是我迄今为止所做的尝试: SELECT s.zone, MIN(o.pri

我使用的是Oracle数据库,我有以下两个表:

  • 空间
    (标识空间(PK)、分区、类型(FK))
  • 报价
    (标识空间(FK)、销售、价格、货币)
我需要找到每个区域空间的最低和最高价格,我有不同货币的空间,我需要一些帮助,我应该在哪里包括这些,以便能够比较和找到最低价格,例如100欧元和100美元。 我需要的类型是“11”,销售需要是“N”

货币可以有‘欧元’、‘美元’等值,简单的换算也可以,比如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美元。有人知道吗

您可以使用
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;

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

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

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

请以文本表格的形式提供样本数据和所需结果。用你正在使用的数据库标记你的问题。也按货币分组。您无法以不同的货币合计金额,因此计算总最小/最大值是无意义的。除此之外,如果没有所指的时间甚至XR来源,任何转换都没有实际意义。今天的汇率和明天的汇率不一样。银行每天更改XR,航空公司每周更改XR,经纪人全天更改XR。如果你想将这些金额转换成一种货币,你需要一个每天有XRs的表格,即使是XR的可能来源谷歌,也会对其机票销售使用不同的汇率,这仅仅是因为航空公司和GDS每周都会改变汇率,而不是每天假设固定汇率是不切实际的。哪怕是一天。我敢打赌(事实上我知道)谷歌的机票使用的XR与网站返回的不同,这仅仅是因为航空公司和GDS更改了XRweekly@PanagiotisKanavos:这取决于用例。对于像应用程序这样的证券交易所来说,是的,那是行不通的。对于许多“正常”用途,例如在欧盟和美国销售的小企业,是的。他们甚至不会每天更改利率,而是采用固定利率,直到利率在较长时间内发生剧烈变化,以至于认为有必要进行更正。即使如此,XR应该在一个单独的表中,这样人们就不必更改所有的报告查询,也不必冒着离开其中一些查询的风险unchanged@PanagiotisKanavos:这的确是个不错的主意。但是OP似乎没有这样一个表格,当我读到这篇文章时,他们明确地对固定利率感到满意(“简单的转换可以像1EUR=1.11USD一样”)。是的,固定利率是可以的,我需要一个大学项目,所以它不会更实用。谢谢好的,这最终会节省一些代码,谢谢你的时间。