【问题标题】:Sub query to perform FX calculation on aggregate query子查询对聚合查询进行 FX 计算
【发布时间】:2013-12-11 15:55:58
【问题描述】:

我有一张transactions 的表格。这些字段有idtrans_dateamountcurrency

我有另一个表 fx_rates,其中包含字段 idfx_datecurrencyrate_to_gbp

我希望汇总某个日期的英镑交易金额。例如

SELECT format(transactions.trans_date, "mm-yyyy") as monthyear, sum(transactions.amount) as amount_sum
FROM transactions
GROUP BY format(transactions.trans_date, "mm-yyyy");

但我的一些交易不是英镑。是否可以使用子查询对具有transactions.currency <> "GBP" 的字段进行货币转换?

类似:

sum(iif(transactions.currency = "GBP",
   transactions.amount,
   transactions.amount / (
     SELECT fx_rates.rate_to_gbp 
     WHERE fx_rates.currency = transactions.currency 
       AND transactions.trans_date = fx_rates.fx_date
   ))

???

编辑:下面的示例数据...

交易:

id      account_id  trans_date  amount      currency
----------------------------------------------------
1797    GFSS35      28/01/2005  365000      USD 
1798    LA1F8       04/03/2005  100247.57                   
1799    IDFS12      31/03/2005  2396.89     GBP         
1800    DF088       06/04/2005  14000       EUR         
1801    BGD005      18/05/2005  450000      

外汇汇率:

id      fx_date     currency    rate_to_gbp
-------------------------------------------
3367    25/11/2018  USD         1.62
3368    25/11/2018  EUR         1.2
3369    25/11/2018  CHF         1.47
3412    11/12/2013  USD         1.64
3413    11/12/2013  EUR         1.2
3414    11/12/2013  CHF         1.46        

【问题讨论】:

  • fx_rates 表包含一个 fx_date 字段。这是否意味着每个currency 可以有不止一行,并且您必须引用fx_date 字段来确定其中哪些适用于特定的transactions.trans_date
  • 在外汇汇率表中,每个货币日期组合不应超过 1 行,因为该表有一个复合唯一键。但我明白你的意思,更新的问题
  • 请为这两个表添加简短的数据样本,并向我们展示您希望从这些数据中获得的输出。
  • 我无法告诉你看到“格式错误”的日期是多么令人反感。 :-(
  • 我同意,但这只是 MS Access 的输出。我使用它实践的 ISO 格式。

标签: mysql sql ms-access


【解决方案1】:

看起来你应该加入。

SELECT format(transactions.trans_date, "mm-yyyy") as monthyear, 
  SUM(IIF(transactions.currency = "GBP" OR transactions.currency = "", 
    transactions.amount,
    transactions.amount/fx_rates.rate_to_gbp)) AS amount_sum
FROM transactions
LEFT JOIN fx_rates 
ON fx_rates.currency = transactions.currency 
AND transactions.trans_date = fx_rates.fx_date
GROUP BY format(transactions.trans_date, "mm-yyyy");

我选择了 LEFT JOIN,因为我不确定当 transactions.currency = "GBP" 时 fx_rates 表中是否会有相应的记录。如果有的话,我会使用 INNER JOIN 来避免 fx_rates.rate_to_gbp 可能为空的任何情况。

【讨论】:

  • 如果在我的fx_rates 表中没有 GBP 条目(因为 rate_to_gbp = 1 表示 GBP)怎么办?此外,许多transactions 记录都有一个空字符串作为其货币,因为该记录是以英镑为单位的。这个 join 方法会忽略这些记录吗?
  • 是的,查询应该像当时写的那样工作。试一试,如果有错误,请告诉我们。
  • 其实再看一遍后,我认为iif语句中需要有第二个条件,这样即使货币是空字符串,它也会接受transactions.amount。您可以类似地为其他基本上表示“GBP”的字符串添加更多条件。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多