【发布时间】:2015-08-17 13:18:07
【问题描述】:
我有三个表:monthly_revenue、currencies 和 foreign_exchange。
monthly_revenue 表
|------------------------------------------------------|
| id | product_id | currency_id | value | month | year |
|------------------------------------------------------|
| 1 | 1 | 1 | 100 | 1 | 2015 |
| 2 | 1 | 2 | 125 | 1 | 2015 |
| 3 | 1 | 3 | 115 | 1 | 2015 |
| 4 | 1 | 1 | 100 | 2 | 2015 |
| 5 | 1 | 2 | 125 | 2 | 2015 |
| 6 | 1 | 3 | 115 | 2 | 2015 |
|------------------------------------------------------|
foreign_exchange 表
|---------------------------------------|
| id | base | target | rate | rate_date |
|---------------------------------------|
| 1 | GBP | USD | 1.6 |2015-01-01 |
| 2 | GBP | USD | 1.62 |2015-01-15 |
| 3 | GBP | USD | 1.61 |2015-01-31 |
| 4 | EUR | USD | 1.2 |2015-01-01 |
| 5 | EUR | USD | 1.4 |2015-01-15 |
| 6 | EUR | USD | 1.4 |2015-01-31 |
| 7 | GBP | EUR | 1.4 |2015-01-01 |
| 8 | GBP | EUR | 1.45 |2015-01-15 |
| 9 | GBP | EUR | 1.44 |2015-01-31 |
|---------------------------------------|
由此,我们可以看到平均外汇汇率:
- 英镑 > 1 月美元为 1.61
- EUR > 1 月美元为 1.33
- GBP > 1 月欧元为 1.43
没有以美元为基础货币的汇率,也没有 2 月的汇率。
货币表
|-----------|
| id | name |
|-----------|
| 1 | GBP |
| 2 | USD |
| 3 | EUR |
|-----------|
我想要实现的目标
monthly_revenue 表中的每一行都可以有不同的currency_id,因为所下的订单是不同的货币。我想以通用货币查看给定月份的所有收入。因此,与其以英镑查看 1 月份的所有收入,然后以美元分别查看 1 月份的所有收入,我想获得 1 月份所有收入的一个值 - 转换为美元(例如)。
可以使用以下公式为每一行计算(本示例使用一月):
收入值 x 1 月份基础货币和目标货币之间的平均汇率
如果我在 1 月份有 50 个订单,使用 4 种不同的货币,这让我可以查看任何单一货币的所有收入。
示例 - 获取 1 月份的所有收入,以美元为单位
这应该返回:
|------------------------------------------------------|
| id | product_id | currency_id | value | month | year |
|------------------------------------------------------|
| 1 | 1 | 1 | 100 | 1 | 2015 |
| 2 | 1 | 2 | 125 | 1 | 2015 |
| 3 | 1 | 3 | 115 | 1 | 2015 |
|------------------------------------------------------|
但是,第 1 行和第 3 行不是美元(分别是英镑和欧元)。
我希望看到的是返回的每一行都包含转换为的平均外汇汇率,以及一个converted 列。例如:
|-------------------------------------------------------------------------|
| id | prod_id | currency_id | value | month | year | fx_avg | converted |
|-------------------------------------------------------------------------|
| 1 | 1 | 1 | 100 | 1 | 2015 | 1.61 | 161 |
| 2 | 1 | 2 | 125 | 1 | 2015 | 1 | 125 |
| 3 | 1 | 3 | 115 | 1 | 2015 | 1.33 | 152.95 |
|-------------------------------------------------------------------------|
我在哪里
我目前可以使用以下查询完成基本计算,但缺少几个关键功能:
如果没有可用的外汇汇率(例如对于当然没有外汇汇率的未来日期),则忽略整行。在这种情况下,我希望使用最近一个月的平均值。
如果在目标货币与基础货币相同的情况下执行计算,则忽略整行(因为 FX 表中没有基础等于目标的记录)。在这种情况下,速率应该被硬定义为 1。
查询至今
SELECT
r.value * IFNULL(AVG(fx.rate),1) as converted, AVG(fx.rate) as averageFx,
r.*, fx.*
FROM
foreign_exchange fx, monthly_revenue r, order_headers h
WHERE
fx.base IN (SELECT name FROM currencies WHERE id = r.currency_id) AND
r.order_header_id = h.id AND
fx.target = 'USD' AND
MONTH(fx.rate_date) = r.month AND
YEAR(fx.rate_date) = r.year AND
r.year = 2015
GROUP BY r.id
ORDER BY month ASC
如果没有可用于 FX 的记录,看起来应该执行一个单独的子查询来获取最近一个月的平均汇率。
任何意见将不胜感激。如果需要任何进一步的信息,请发表评论。
谢谢。
编辑 Here is a SQFiddle 包含示例架构和突出问题的代码。
【问题讨论】:
-
“将记录的价值乘以产生收入的月份的平均外汇汇率”——这是一种标准的统计方法吗?!?!
-
不,但为了这个问题的目的,这是一个简化。问题中的措辞有点偏离,但我会修改它。
-
好的,你能提供一个同样的 sqlfiddle 吗?
-
好的,请查看已编辑帖子中的链接。
-
干得好。这几乎是现在应该如何在 SO 上提出此类问题的模型。
标签: mysql