Вывод перекрёстных данных из таблиц без условия соединения в 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'])

Полезные ссылки

Тэги:

Тэг в списке: