我怎样才能声明一个variables来读取不同的表列?

我需要运行一个查询,这个查询需要运行取决于我的Excel文件中的数据。 所以我应该创build一个ETL作业来读取这个excel文件到临时表。 用户可以在不同date更改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_idvariables可以读取临时表,如果ques_p_id = 1〜9然后在我的报表查询中使用1〜9。 所以我需要帮助在我的查询声明这个variables。

如果我需要确定临时表中的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) 

ques_d_id将通过p_id更改数字,如果P_id = 9,它将改为WHEN ques_d_id = 520 THEN 520 END …..等……

 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 

谢谢

如果我正确理解你的问题,那么你最好是一个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字段的函数添加第二个参数,以便您可以对其他date使用相同的函数。 那么你应该在函数返回的表中添加一个字段来确定它所在的date。

然后你可以生成这样的报告:

 SELECT * FROM generate_AAA_report(9); 

报告当然只是查询的输出。 如果要保存它,可以在COPY命令中使用此查询来创build一个CSV文件,您可以在Excel中再次打开该文件,也可以像下面这样创build物理表:

 CREATE TABLE AAA_report_3 AS SELECT * FROM generate_AAA_report(3); 

请注意该函数返回一个表,所以你应该使用它作为一个行源(在查询的FROM子句)。