使用Postgres映射两个表

时间:2018-07-05 16:59:54

标签: postgresql

我有两个桌子,

表_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

通过使用上面的输出,我想通过匹配列和名称来搜索table_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 :(得分:1)

这可以通过数据库功能解决。首先,让我们创建表格并用示例数据填充它们。

创建并填写表格_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')。

我们首先从projectDate变量的值生成表2中日期列的名称。有了名称后,就可以通过分别用%scolumnName变量的值替换projectName占位符来生成动态sql查询。

我们执行查询并将结果存储在此函数返回的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