2017-11-04 182 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中的预期类型整数不匹配。”?

postgresql程序代码: -

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, ... 

但我认为一个单一的数据透视查询可能会更好。