【问题标题】:Mapping with two tables using Postgres使用 Postgres 映射两个表
【发布时间】:2018-07-05 16:59:53
【问题描述】:

我有两张桌子,

Table_1 包含类似,

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

Table_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

我想根据 project_name 和日期的映射来获取值。

这是我尝试过的。 将 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

请给我一个解决方案。提前致谢

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

    创建和填充 table_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') ;
    

    创建和填充 table_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 中日期列的名称。一旦我们有了名称,我们就会生成一个动态 sql 查询,方法是将 %s 占位符分别替换为 columnNameprojectName 变量的值。

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

    【讨论】:

    • 我必须把上面的查询而不是 selectQuery 放在那里吗?你能帮忙吗???
    • 不,你不需要这样做。只需执行我发布的第一块代码(以CREATE OR REPLACE 开头并以$$ language 'plpgsql 结尾的代码块)。执行之后(该语句只需要执行一次,因为函数只需要执行一次),您可以使用所需格式的SELECT project_name, Date, getData(project_name, Date) FROM table_1;。如果你愿意,我可以发布带有测试数据的完整 sql 示例。
    • LINE 1: SELECT project_name, first_move_in_date, getData(project_nam... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。我收到此错误跨度>
    • 你执行过CREATE功能代码块吗?请尝试按照我写的顺序执行我写的所有代码。
    • 显示你正在使用的 select 语句。它与我使用的不同。
    猜你喜欢
    • 2016-05-13
    • 2021-10-28
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2012-06-19
    • 2021-12-23
    相关资源
    最近更新 更多