У меня есть три таблицы: monthly_revenue
, currencies
и foreign_exchange
.
Таблица ежемесячных_доступа
|------------------------------------------------------|
| 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 |
|---------------------------------------|
Из этого можно видеть средние значения fx:
- GBP > USD в январе - 1.61
- EUR > USD в январе - 1.33
- GBP > EUR в январе - 1.43
Для доллара США в качестве базовой валюты нет курсов, и в феврале нет ставок.
таблица валют
|-----------|
| id | name |
|-----------|
| 1 | GBP |
| 2 | USD |
| 3 | EUR |
|-----------|
Что я пытаюсь достичь
Каждая строка в таблице monthly_revenue
может иметь другую currency_id
, так как размещены ордера - разные валюты. Я хочу видеть весь доход за данный месяц в единой валюте. Таким образом, вместо того, чтобы смотреть на весь доход в январе в фунтах стерлингов, а затем отдельно глядя на весь доход в январе в долларах США, я хотел бы получить одну стоимость за весь доход в январе - конвертированный в доллары США (например).
Это может быть рассчитано для каждой строки, используя следующее (используя январь для этого примера):
значение дохода x средняя ставка fx за январь между базовой и целевой валютой
Если у меня есть 50 заказов в январе, в 4 разных валютах, это позволит мне видеть весь доход в любой валюте.
Пример - получить весь доход в январе, в долларах США
Это должно возвратиться:
|------------------------------------------------------|
| 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 не указаны в долларах США (это GBP и EUR соответственно).
То, что я хотел бы увидеть, - это каждая строка, возвращенная со средней скоростью обмена валют, которая преобразуется в столбец 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 недоступен), то вся строка игнорируется. В этом случае я хотел бы использовать последний средний месяц.
-
Если вычисление выполняется там, где целевая валюта совпадает с базовой валютой, вся строка игнорируется (поскольку в таблице 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 нет записей, похоже, что для получения среднего значения последних месячных ставок необходимо выполнить отдельный подзапрос.
Любой ввод будет оценен. Если какая-либо дополнительная информация требуется, напишите комментарий.
Спасибо.
Изменить Вот SQFiddle, в котором есть примеры схем и кода, который подчеркивает проблему.