2017-11-04 2 views
0

ERROR: structure of query does not match function result type DETAIL: Returned type double precision does not match expected type integer in column 1. CONTEXT: PL/pgSQL function get_analysis1_data(date,date) line 38 at RETURN QUERY ********** Error **********"질의 구조가 함수 결과 유형과 일치하지 않습니다. 반환 된 유형 배정 밀도가 열 1의 예상 유형 정수와 일치하지 않습니다." <code>postgresql</code> 절차의 코드에 대한

: -

CREATE 
OR REPLACE FUNCTION public.get_analysis1_data(IN date, IN date) RETURNS TABLE (loc_no integer, loc_d_share double precision, loc_id_share double precision, loc_id_share_per double precision, loc_a integer, loc_m integer, loc_l integer, loc_oneway integer, loc_round integer, loc_replacement integer, loc_oncall integer, loc_avg_idshare double precision, out_no integer, out_d_share double precision, out_id_share double precision, out_id_share_per double precision, out_a integer, out_m integer, out_l integer, out_oneway integer, out_round integer, out_replacement integer, out_oncall integer, out_avg_idshare double precision) AS $ BODY $ 
DECLARE in_from_date ALIAS FOR $1; 
in_to_date ALIAS FOR $2; 
loc_no integer; 
loc_d_share double precision; 
loc_id_share double precision; 
loc_id_share_per double precision; 
loc_a integer; 
loc_m integer; 
loc_l integer; 
loc_oneway integer; 
loc_round integer; 
loc_replacement integer; 
loc_oncall integer; 
loc_avg_idshare double precision; 
out_no integer; 
out_d_share double precision; 
out_id_share double precision; 
out_id_share_per double precision; 
out_a integer; 
out_m integer; 
out_l integer; 
out_oneway integer; 
out_round integer; 
out_replacement integer; 
out_oncall integer; 
out_avg_idshare double precision; 
BEGIN 
    RETURN Query 
    SELECT 
(( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     (
      is_outstation = FALSE 
     ) 
     and 
     (
      reporting_date BETWEEN in_from_date AND in_to_date 
     ) 
) 
     UNION 
( 
     SELECT 
     coalesce(round(SUM(driver_share)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round(SUM(id_share)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round((SUM(id_share)/SUM(driver_share + id_share))*100), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     car_type = 'A' 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     car_type = 'M' 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     car_type = 'L' 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     is_round_trip = FALSE 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     is_round_trip = TRUE 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     trip_type = 'Replacement' 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     trip_type = 'OnCall' 
     AND is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round(AVG(id_share)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = FALSE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round(SUM(driver_share)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round(SUM(id_share)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round(((SUM(id_share)/SUM(driver_share + id_share))*100)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     car_type = 'A' 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     car_type = 'M' 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     car_type = 'L' 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     is_round_trip = FALSE 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     is_round_trip = TRUE 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     trip_type = 'Replacement' 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     count(*) 
     FROM 
     bookings 
     WHERE 
     trip_type = 'OnCall' 
     AND is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date) 
     UNION 
( 
     SELECT 
     coalesce(round(AVG(id_share)), 0) 
     FROM 
     bookings 
     WHERE 
     is_outstation = TRUE 
     AND reporting_date BETWEEN in_from_date AND in_to_date)) ; 
END 
$ BODY $ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; 



ALTER FUNCTION public.get_analysis1_data(date, date) OWNER TO 
postgres; 

답변

0

난 당신이 볼 수있는 오류가 많은 사람들의 첫 번째가 될 것입니다 생각합니다.

CREATE OR REPLACE FUNCTION public.get_analysis1_data(IN date, IN date) 
    RETURNS TABLE (
    loc_no integer, 
    loc_d_share double precision, 
    loc_id_share double precision, 
    loc_id_share_per double precision, 
    loc_a integer, 
    loc_m integer, 
    loc_l integer, 
    loc_oneway integer, 
    loc_round integer, 
    loc_replacement integer, 
    loc_oncall integer, 
    loc_avg_idshare double precision, 
    out_no integer, 
    out_d_share double precision, 
    out_id_share double precision, 
    out_id_share_per double precision, 
    out_a integer, 
    out_m integer, 
    out_l integer, 
    out_oneway integer, 
    out_round integer, 
    out_replacement integer, 
    out_oncall integer, 
    out_avg_idshare double precision) AS 

그러나 지금까지 내가 말할 수있는, 쿼리는 다시 하나의 열을 반환 (혼합 데이터 유형은 부팅) : 함수는 레코드는 다음과 같습니다이 돌아와보고 싶어 나타냅니다. 다른 20 개 이상의 필드는 어떻게됩니까?

오류 자체는 거의 중요하지 않습니다. 쿼리가 배정도 (아마도 : coalesce(round((SUM(id_share)/ SUM(driver_share + id_share)) * 100),이기 때문에)를 반환하지만 실제 문제는 아닙니다. 나는 당신의 문제가 당신의 질문이 기능이 기대하는 것처럼 보이지 않는다고 생각한다.

내가 추측해야만한다면 일련의 통합 쿼리에서 쿼리 결과가 수직이 아니라 가로형 (피벗 팅)이되기를 원합니다.

나는이 추천 아니지만, 당신은이 작업을 수행 할 수처럼 기능이 내장 된 방법은 보인다 :

SELECT count(*) 
INTO loc_m 
FROM bookings 
WHERE car_type = 'A' 
AND is_outstation = FALSE 
AND reporting_date BETWEEN in_from_date AND in_to_date; 

(두 번째 줄의 추가, INTO주의) 쿼리의 마지막 줄은 다음과 같습니다.

return query select ... loc_m, ... 

하지만 피벗 쿼리가 더 좋을 수도 있습니다.

관련 문제