Сопоставление с двумя таблицами с использованием Postgres - PullRequest
0 голосов
/ 05 июля 2018

У меня есть две таблицы,

Таблица_1 содержит как,

Project_name    Date          value
P1              15/06/2016
P2              25/04/2017
P3              18/06/2017
P4              12/05/2017

Таблица_2 содержит как,

Name      Occ_June_2016  Occ_April_2017 Occ_May_2017  Occ_June_2017  
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

Я хочу получить значение на основе сопоставления имени_проекта и даты.

Вот что я пробовал. Преобразование столбца даты table_1 в определенный формат,

 SELECT to_char(to_date(a.date, 'DD-MM-YYYY'), 'mon_YYYY') from table_1 a ;

Вывод я получил как

jun_2016
apr_2017
jun_2017
may_2017

Используя вышеприведенный вывод, я хочу найти столбец в таблице_2, сопоставив столбец и имя,

Я пытаюсь получить столбцы на основе условия частичного совпадения,

select column_name from information_schema.COLUMNS as c where c.TABLE_NAME = 'table_2' and c.COLUMN_NAME like '%occ_%';

Вот вывод для вышеуказанного запроса,

Occ_June_2016  
Occ_April_2017 
Occ_May_2017  
Occ_June_2017

Теперь мне нужно взять вывод одного запроса на вход одного запроса. Вот где я застрял. Отображение даты на основе имени.

Мой вывод должен быть таким,

Project_name    Date            value
P1              15/06/2016      8.1
P2              25/04/2017      7.4
P3              18/06/2017      8.1 
P4              12/05/2017      6.8

пожалуйста, дайте мне решение. Заранее спасибо

1 Ответ

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

Это можно решить с помощью функции базы данных. Во-первых, давайте создадим таблицы и наполним их примерами данных.

Создание и заполнение таблицы_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...