Это можно решить с помощью функции базы данных. Во-первых, давайте создадим таблицы и наполним их примерами данных.
Создание и заполнение таблицы_1
CREATE TABLE table_1 (project_name TEXT, Date DATE, value TEXT);
INSERT INTO table_1(project_name, Date) VALUES ('P1','06/15/2016'), ('P2','04/25/2017'), ('P3','06/23/2017'), ('P4','05/12/2017') ;
Создание и заполнение таблицы_2
CREATE TABLE table_2 (name TEXT, occ_june_2016 DECIMAL, occ_april_2017 DECIMAL, occ_may_2017 DECIMAL, occ_june_2017 DECIMAL);
INSERT INTO table_2(name, occ_june_2016, occ_april_2017, occ_may_2017, occ_june_2017) VALUES
('P1', 8.1, 7.5, 6.5, 8.2),
('P2', 8.3, 7.4, 6.0, 8.5),
('P3', 8.6, 7.1, 6.1, 8.1),
('P4', 8.8, 7.9, 6.8, 8.9);
Далее мы создаем функцию:
CREATE OR REPLACE FUNCTION getData(projectName TEXT, projectDate DATE)
RETURNS DECIMAL
AS
$$
DECLARE
columnName TEXT := 'Occ_' || trim(to_char(projectDate, 'Month')) || '_' || to_char(projectDate, 'yyyy');
selectQuery TEXT := 'SELECT %s FROM table_2 where name = ''%s'' LIMIT 1';
returnValue DECIMAL;
BEGIN
selectQuery = format(selectQuery, columnName, projectName);
EXECUTE selectQuery INTO returnValue;
RETURN returnValue;
END;
$$ LANGUAGE 'plpgsql';
Функция принимает 2 аргумента. Первый (projectName
) представляет название проекта (например, «P1»). Второй (projectDate
) - это дата, в которую мы хотим получить данные (например, '15 / 06/2016').
Мы начнем с создания имени столбца даты в таблице 2 из значения переменной projectDate
. Получив имя, мы генерируем динамический SQL-запрос, заменяя заполнители %s
на значения переменных columnName
и projectName
соответственно.
Мы выполняем запрос и сохраняем результат в переменной returnValue
, которую возвращает эта функция.
После того, как мы создали таблицы и функцию, мы можем выполнить следующий запрос:
SELECT project_name, Date, getData(project_name, Date) FROM table_1;
Этот запрос возвращает следующий результат:
project_name date getdata
P1 2016-06-15 8.1
P2 2017-04-25 7.4
P3 2017-06-23 8.1
P4 2017-05-12 6.8