Вывод перекрёстных данных из таблиц без условия соединения в PostgreSQL
Что имеем изначально:
1. Есть таблица Журнал(journal), которая хранит значения определённых параметров для определённой сущности в разное время и имеет вот такой вид:
Id | entity_id | date | parameter1 | parameter2 | parameter3 | ... | parameterN | type_work |
---|---|---|---|---|---|---|---|---|
1 | 1 | 2021-07-28 | 111 | 222 | 333 | ... | 1001 | 1 |
2 | 1 | 2021-07-28 | 444 | 555 | 666 | ... | 1002 | 2 |
3 | 1 | 2021-07-28 | 777 | 888 | 999 | ... | 1003 | 3 |
4 | 2 | 2021-07-28 | 1 | 2 | 3 | ... | 1004 | 1 |
5 | 3 | 2021-07-29 | 4 | 5 | 6 | ... | 1005 | 1 |
2. Также ещё есть и таблица Параметры(param), которая имеет следующий вид:
Id | Title | Code |
---|---|---|
1 | Параметр 1 | parametr1 |
2 | Параметр 2 | parametr2 |
3 | Параметр 3 | parametr3 |
. | .......... | ......... |
N | Параметр N | parametrN |
3. Что нужно: написать запрос, который принимает 2 параметра:
- Id сущности, то есть entity_id
- дату, то есть date
Необходимо по дате и по Id сущности взять данные из таблицы Журнала(journal) и положить её в результирующую таблицу result_data, которая должна будет иметь следующий вид (например для entity_id = 1 и date = '2021-07-28'):
Id | entity_id | date | type_work | param_id | value |
---|---|---|---|---|---|
1 | 1 | 2021-07-28 | 1 | 1 | 111 |
2 | 1 | 2021-07-28 | 1 | 2 | 222 |
3 | 1 | 2021-07-28 | 1 | 3 | 333 |
...... | ......... | .......... | ......... | ........ | ..... |
N | 1 | 2021-07-28 | 1 | N | 1001 |
N+1 | 1 | 2021-07-28 | 2 | 1 | 444 |
N+2 | 1 | 2021-07-28 | 2 | 2 | 555 |
N+3 | 1 | 2021-07-28 | 2 | 3 | 666 |
...... | ......... | .......... | ......... | ........ | ..... |
2N | 1 | 2021-07-28 | 2 | N | 1002 |
2N+1 | 1 | 2021-07-28 | 3 | 1 | 777 |
2N+2 | 1 | 2021-07-28 | 3 | 2 | 888 |
2N+3 | 1 | 2021-07-28 | 3 | 3 | 999 |
...... | ......... | .......... | ......... | ........ | ..... |
3N | 1 | 2021-07-28 | 3 | N | 1003 |
Запрос выглядит следующим образом:
SELECT j.entity_id, j.date, j.type_work, p.id, CASE WHEN p.code = 'parametr1' THEN j.parameter1 WHEN p.code = 'parametr2' THEN j.parameter2 WHEN p.code = 'parametr3' THEN j.parameter3 END as value FROM journal AS j CROSS JOIN param AS p WHERE j.date = '2021-07-28'::date AND j.entity_id = 1 AND p.code=ANY(ARRAY['parametr1', 'parametr2', 'parametr3'])