2016-08-26 2 views
2

쿼리를 실행해야하는데이 쿼리를 실행하려면 Excel 파일의 데이터가 필요합니다. 그래서이 excel 파일을 임시 테이블에 읽도록 ​​ETL 작업을 생성해야합니다. 사용자는 다른 날짜에 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 

그리고 Ques_P_ID에 AAA 보고서 기지를 생성하는 또 다른 SQL 스크립트가 있습니다.

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

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 

에 따라 보고서 AAA 보고서를 생성합니다 : 지금 나는 REPORT_NAME이 = AAA와 Ques_P_ID = (9)는 다음과 같이 쿼리를 실행하면 수행 할 그래서 변수에 ques_p_id를 만들고 싶다면 ques_p_id = 1 ~ 9이고 내 보고서 쿼리에 1 ~ 9를 사용하면 임시 테이블을 읽을 수 있습니다. 그래서 내 쿼리에이 변수를 선언하는 데 도움이 필요합니다.

임시 테이블에서 ques_p_id를 식별해야하는 경우이 권한이 필요합니까? 는 등 ..... 언제 ques_d_id = 520 THEN (520) END로 변경됩니다 P_id = 9, 경우

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으로 번호를 변경합니다. .....

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

내가 제대로 문제를 이해한다면, 당신이 최고 bet은 ques_p_id을 매개 변수로 취하는 SQL 함수입니다. 다음과 같습니다 쿼리에 일부 개조하면 되겠으로 : 당신은뿐만 아니라 다른 날짜에 동일한 기능을 사용할 수 있도록

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); 

주 함수가 그 테이블을 반환하므로 쿼리의 FROM 절에있는 행 원본으로 사용해야합니다.

+0

도와 주셔서 감사합니다. 도움이됩니다. – Leo

+0

안녕하세요, 귀하의 추가 문제로 새로운 질문을 게시하는 것을 보지 못했습니다. 글을 올리면 다시 살펴볼 것입니다. 기본적으로 다른 데이터를 매개 변수로 만들 수 있으며, 아마도 generate_AAA_report (8, [320, 321]) 또는'(9, [520]) '와 같은 값의 배열 일 수 있습니다.그러나 그것은 위의 솔루션 코드를 깨뜨릴 것이므로 새로운 질문을하는 것이 다른 사용자로부터 더 많은 관심을 끌 수 있도록하는 것이 가장 좋습니다. – Patrick

관련 문제