如何声明变量以从不同的表列中读取?

时间:2016-08-26 03:42:02

标签: sql excel postgresql

我需要运行一个查询,这个查询需要运行取决于我的excel文件中的数据。所以我应该创建一个ETL作业来将这个excel文件读取到临时表。用户可以在不同的日期更改Ques_P_id,因此我可以将其读取到临时表中。

我的临时表中有三列:

   Report_name      | Ques_P_ID |        Ques_R_ID  

   AAA              7(could be 1~12)        132
   BBB              8(could be 1~12)        032 

我还有另一个sql脚本来生成基于Ques_P_ID的AAA报告。现在我想做的是,如果report_name = AAA并且Ques_P_ID = 9,那么就像这样运行查询:

select a.contr_id, a.ques_r_id, a.ques_P_id, 
       max(case when ques_d_id = 320 then ques_d_id else NULL end) as "8-320",
       max(case when ques_d_id = 321 then ques_d_id else NULL end) as "8-321"
from PODS.v_questionnaire_results_master A
left join PODS.v_questionnaire_results_detail B on A.ques_r_id = B.ques_r_id
where 1=1 
and a.update_date = '20160824'
and a.ques_p_id = 8
and a.contr_id <> ''
group by 1,2,3;

此查询将根据ques_p_id = 8

生成报告AAA报告
contr_id    ques_r_id   ques_p_id   8-320   8-321
42315221    284806        8           320   
44501488    282575        8           320   
12817427    284460        8           320   
11336635    284864        8           320   
53040071    282691        8                   321
50408289    284398        8                   321

所以我想让ques_p_id变量可以读取临时表,如果ques_p_id = 1~9则在我的报表查询中使用1~9。所以我需要帮助在我的查询中声明这个变量。

如果我需要在临时表中识别ques_p_id,我应该这样做吗?

Declare @P  int
Set @P = select (ques_p_ID) from temp_table_excel
select * From generate_AAA_report(@P); 

还有这个脚本

max(CASE WHEN ques_d_id = 320 THEN 320 END),
           max(CASE WHEN ques_d_id = 321 THEN 321 END)
如果P_id = 9,

ques_d_id会将数字改为p_id, 它将改为WHEN ques_d_id = 520那么520结束.....等......

ques_p_id   ques_m_id   ques_d_id
    8          1           320    
    8          1           321
    8          1           322
    8          1           323
    8          2           324
    9          1           445
    9          1           446
    9          1           447
    9          2           448
    9          2           449
    9          2           450

由于

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么最好的办法是将<script> document.write("<base href='"+ window.location.protocol +'//' + window.location.host + "' >"); </script>作为参数的SQL函数。对您的查询进行一些调整,如下所示:

ques_p_id

您可以为CREATE FUNCTION generate_AAA_report(p_id integer) RETURNS TABLE(contr_id text, ques_r_id int, ques_p_id int, "8-320" int, "8-321" int) AS $$ SELECT a.contr_id, ques_r_id, p_id, max(CASE WHEN ques_d_id = 320 THEN 320 END), max(CASE WHEN ques_d_id = 321 THEN 321 END) FROM PODS.v_questionnaire_results_master A LEFT JOIN PODS.v_questionnaire_results_detail B USING (ques_r_id) WHERE a.update_date = '20160824' AND a.ques_p_id = p_id AND a.contr_id <> '' GROUP BY 1,2,3; $$ LANGUAGE sql STRICT STABLE; 字段的函数添加第二个参数,以便您也可以将相同的函数用于其他日期。然后,您可能还应该从函数返回的表中添加一个字段,以确定它的用途。

然后,您可以生成如下报告:

update_date

报告当然只是查询的输出。如果要保存它,可以在SELECT * FROM generate_AAA_report(9); 命令中使用此查询来创建可以再次在Excel中打开的CSV文件,或者可以创建如下物理表:

COPY

请注意,该函数返回一个表,因此您应该将其用作行源(在查询的CREATE TABLE AAA_report_3 AS SELECT * FROM generate_AAA_report(3); 子句中)。