我有一张具有以下格式的postgres表:
我希望将两个(或更多)列添加到右侧(或可能左侧),如下所示:
但如果我尝试这样做,我就明白了:
错误:返回类型无效
详细信息:查询指定的返回元组有15列,但交叉表返回14.
上下文:PL / pgSQL函数> RETURN QUERY的第8行(日期,日期)
这是我的代码: 有人可以帮帮我吗?
CREATE OR REPLACE FUNCTION carranza(
IN p_fecha_inicio date,
IN p_fecha_fin date)
RETURNS TABLE(r_sucursal text, r_cliente text, r_nombre_cliente character varying, r_fecha_pago text, r_fecha_inicio text, r_fecha_fin text, r_fecha_proceso text, r_proceso text, r_nomina text, r_periodo text, r_desc_periodo text, r_fecha_factura text, r_factura text, r_cia text, r_servicio text, r_total text, r_costo_nt text, r_costo_sc text) AS
$BODY$
DECLARE
v_registros record;
BEGIN
RETURN QUERY
SELECT
(SELECT sucursal_name FROM "Facturacion_facturaprevia" WHERE factura_generada_id = obj_concentrado."factura"::integer)::text,
obj_concentrado."id cliente",
(SELECT cliente FROM "Clientes_cliente" WHERE id = obj_concentrado."id cliente"::integer),
obj_concentrado."fecha_pago",
obj_concentrado."fecha_inicio",
obj_concentrado."fecha_fin",
obj_concentrado."fecha_proceso",
obj_concentrado."proceso",
obj_concentrado."num_nomin",
obj_concentrado."periodo",
(SELECT descripcion_corta FROM "Catalogos_tiponomina" WHERE id_primario = obj_concentrado."descrip periodo")::text,
(SELECT fecha::date FROM "Facturacion_facturagenerada" WHERE id = obj_concentrado."factura"::integer)::text,
obj_concentrado."factura",
(SELECT cia FROM "Facturacion_facturagenerada" WHERE id = obj_concentrado."factura"::integer)::text,
(SELECT desc_corta FROM "Catalogos_servicio" WHERE id = obj_concentrado."servicio_id"::integer)::text,
(SELECT total_factura FROM "Facturacion_facturagenerada" WHERE id = obj_concentrado."factura"::integer)::text,
obj_concentrado."cia_NT",
obj_concentrado."cia_SC"
FROM (
SELECT * FROM crosstab (
'SELECT
proceso::text,
num_nomina::text,
(periodo || ''-'' || periodo_esp) as periodo,
tipo_periodo,
fecha_inicio::text,
fecha_fin::text,
fecha_pago::text,
fecha_proceso::text,
cliente_id::text,
servicio_id::text,
factura::text,
tipo_compania::text,
sum(activas)::text,
sum(canceladas)::text
FROM (
SELECT
factura,
cliente_id,
CASE
WHEN nat_concepto_id = 1 AND estatus = true
THEN importe
WHEN nat_concepto_id = 2 AND estatus = true
THEN importe * -1
WHEN nat_concepto_id = 3 AND estatus = true
THEN importe
END activas,
CASE
WHEN nat_concepto_id = 1 AND estatus = false
THEN importe
WHEN nat_concepto_id = 2 AND estatus = false
THEN importe * -1
WHEN nat_concepto_id = 3 AND estatus = false
THEN importe
END canceladas,
tipo_compania,
fecha_inicio,
fecha_fin,
fecha_pago,
fecha_proceso,
num_nomina,
servicio_id,
proceso,
periodo,
periodo_esp,
tipo_periodo
FROM "Facturacion_detallenomina"
WHERE (proceso || ''-'' || num_nomina) IN (
SELECT proceso || ''-'' || nomina
FROM (
SELECT distinct(proceso), nomina
FROM "Facturacion_facturapreviadataregistros"
WHERE facturaprevia_id IN (
SELECT id
FROM "Facturacion_facturaprevia"
WHERE factura_generada_id IN (select id FROM "Facturacion_facturagenerada" where num_factura<>'''')
)
) obj_data
)AND NOT rubro_id = ANY(ARRAY[0,10,14])
)obj_importes
GROUP BY tipo_compania, factura, cliente_id, fecha_pago, fecha_fin, fecha_inicio, fecha_proceso, num_nomina, proceso, periodo, periodo_esp, tipo_periodo, servicio_id
ORDER BY factura',
'select m from generate_series(1,2) m'
)as (
"proceso" text,
"num_nomin" text,
"periodo" text,
"descrip periodo" text,
"fecha_inicio" text,
"fecha_fin" text,
"fecha_pago" text,
"fecha_proceso" text,
"id cliente" text,
"servicio_id" text,
"factura" text,
"cia_NT" text,
"cia_SC" text,
"cia_nt_can" text,
"cia_sc_can" text
)
)obj_concentrado;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION carranza(date, date)
OWNER TO curso;