我有两个桌子,
表_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
请给我一个解决方案。预先感谢
答案 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中日期列的名称。有了名称后,就可以通过分别用%s
和columnName
变量的值替换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