Транспонировать данные при объединении в MySQL - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующие две таблицы:

Опишите Фьючерсы ;

+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| ID     | int(11)      | NO   | PRI | NULL    | auto_increment |
| DATE   | date         | YES  |     | NULL    |                |
| NAME   | varchar(10)  | YES  |     | NULL    |                |
| VALUE  | decimal(4,2) | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+

Опишите Индекс ;

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| ID    | int(11)      | NO   | PRI | NULL    | auto_increment |
| DATE  | date         | YES  |     | NULL    |                |
| VALUE | decimal(4,2) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

В таблице Фьючерсы У меня есть такие данные:

2018-06-13 AUG 2018 20.10
2018-06-13 SEP 2018 21.10

2018-06-14 AUG 2018 20.25
2018-06-14 SEP 2018 21.35
...

(Обычно я бы выбрал * из фьючерса, где NAME = "AUG 2018" заказ по ДАТЕ, чтобы посмотреть, какие данные были в августе 2018 года)

В таблице Индекс , у меня есть простые данные, подобные этим:

2018-06-13 32.10
2018-06-14 32.50
...

Теперь я хотел бы создать такой простой отчет, как этот:

+------------+-------+----------+----------+
| DATE       | INDEX | AUG 2018 | SEP 2018 |
+------------+-------+----------+----------+
| 2018-06-13 | 32.10 | 20.10    | 21.10    |
| 2018-06-14 | 32.50 | 20.25    | 21.35    |
+------------+-------+----------+----------+

( Index и Futures таблицы должны быть объединены DATE)

Возможно ли это в MySQL или мне приходится использовать языки сценариев?

Спасибо

1 Ответ

0 голосов
/ 04 июля 2018

Один метод использует join и агрегирование:

select i.date, i.index,
       max(case when f.name = 'Aug' then f.value end) as Aug,
       max(case when f.name = 'Sep' then f.value end) as Sep
from index i left join
     futures f
     on i.date = f.date
group by i.date, i.index;

Это хорошо масштабируется, но требует агрегирования всех данных. Альтернатива использует два соединения:

select i.date, i.index,
       faug.value as aug, fsep.value as sep
from index i left join
     futures faug
     on faug.date = i.date and faug.name = 'Aug' left join
     futures fsep
     on fsep.date = i.date and fsep. name = 'Sep';

Обратите внимание, что index - это ключевое слово SQL, поэтому это недопустимое имя для таблицы.

...