与交叉表的麻烦

时间:2015-12-15 19:43:40

标签: postgresql crosstab generate-series

我有一张具有以下格式的postgres表:

enter image description here

我希望将两个(或更多)列添加到右侧(或可能左侧),如下所示:

enter image description here

但如果我尝试这样做,我就明白了:

  

错误:返回类型无效

     

详细信息:查询指定的返回元组有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;

0 个答案:

没有答案