Vous êtes sur la page 1sur 5

-- Function: machine_departamento_provincias()

-- DROP FUNCTION machine_departamento_provincias();


CREATE OR REPLACE FUNCTION machine_departamento_provincias()
RETURNS void AS
$BODY$
DECLARE

var_depa varchar;
n_depa int;
var_prov varchar;
n_prov int;
numerodecos int;
ini_head int;
fin_head int;
cadena text;
fecha_inicio date := '2014-01-01';
BEGIN
numerodecos := 0;
--CREACION DE TABLA CON RESTRICCION ACTIVACION-BASE PARA EVITAR ERRORES EN LA CO
RRIDA
DROP TABLE IF EXISTS machine_departamento_provincias_total;
CREATE TABLE machine_departamento_provincias_total as (
SELECT f_base,f_act,0::int count
FROM machine_bd
WHERE f_act >= '2014-01-01'
GROUP BY f_act,f_base ORDER BY f_base,f_act
);
--CREACION DE ESTRUCTURA DE LA TABLA PRINCIPAL
-- select * from machine_departamento_provincias
DROP TABLE IF EXISTS machine_departamento_provincias;
CREATE TABLE machine_departamento_provincias as (
SELECT null::int as gid,null::int as tabla_id, null::int as zona_id, nul
l::int as dealer_id, null::int as depa_id, null::int as prov_id, null::int dato_
id, null::int as color_id,*
FROM crosstab(
'SELECT descripcion(f_act),descripcion(f_base),count n FROM machine_d
epartamento_provincias_total ORDER BY f_act,f_base',
'SELECT descripcion(f_base) FROM machine_departamento_provincias_tota
l GROUP BY f_base ORDER BY f_base'
) AS (
f_act varchar,
/*"Ene-12" varchar,"Feb-12" varchar,"Mar-12" varchar,"Abr-12" va
rchar,"May-12" varchar,"Jun-12" varchar,"Jul-12" varchar,
"Ago-12" varchar,"Sep-12" varchar,"Oct-12" varchar,"Nov-12" varc
har,"Dic-12" varchar,
"Ene-13" varchar,"Feb-13" varchar,"Mar-13" varchar,"Abr-13" varc
har,"May-13" varchar,"Jun-13" varchar,"Jul-13" varchar,
"Ago-13" varchar,"Sep-13" varchar,"Oct-13" varchar,"Nov-13" varc
har,"Dic-13" varchar,*/
"Ene-14" varchar,"Feb-14" varchar,"Mar-14" varchar,"Abr-14" varc
har,"May-14" varchar,"Jun-14" varchar,"Jul-14" varchar,
"Ago-14" varchar,"Sep-14" varchar,"Oct-14" varchar,"Nov-14" varc
har,"Dic-14" varchar,
"Ene-15" varchar,"Feb-15" varchar,"Mar-15" varchar,"Abr-15" varc
har,"May-15" varchar,"Jun-15" varchar,"Jul-15" varchar,
"Ago-15" varchar,"Sep-15" varchar,"Oct-15" varchar,"Nov-15" varc
har,"Dic-15" varchar,
"Ene-16" varchar,"Feb-16" varchar,"Mar-16" varchar,"Abr-16" varc
har,"May-16" varchar,"Jun-16" varchar,"Jul-16" varchar,
"Ago-16" varchar,"Sep-16" varchar
)
LIMIT 0
);

DROP TABLE if exists machine_consulta_depas;


CREATE TABLE machine_consulta_depas as (
SELECT distinct departamento_inicial as departamento
FROM machine_variables_alan
ORDER BY 1
);
alter table machine_consulta_depas add column id_tabla serial;

drop sequence if exists machine_consulta_departamento_depas_id_seq;


create sequence machine_consulta_departamento_depas_id_seq;
FOR var_depa IN ( SELECT DISTINCT departamento from machine_consulta_depas ORDER
BY 1 ) LOOP
n_depa := nextval('machine_consulta_departamento_depas_id_seq');
--INSERTANDO ENCABEZADO DE HOJA
cadena := 'INSERT INTO machine_departamento_provincias values (null,'||n
_depa||',0,0,0,0,0,0,''ACTIVACIN''';
ini_head := 10;
fin_head := (SELECT max(ordinal_position) FROM information_schema.column
s WHERE table_name = 'machine_departamento_provincias');
FOR n IN ini_head .. fin_head LOOP
cadena := cadena || (SELECT ','''||column_name||'''' as columna
FROM information_schema.columns
WHERE table_name = 'machine_departamento_provincias' AND
ordinal_position = n
ORDER BY ordinal_position);
END LOOP;
cadena := cadena || ');';
EXECUTE cadena;
IF (numerodecos = 0) THEN
-- TABLA CON CRITERIOS
DROP TABLE if exists machine_consulta_departamento;
CREATE TABLE machine_consulta_departamento as (
SELECT provincia_inicial as provincia
FROM machine_variables_alan
WHERE
departamento_inicial = var_depa
AND customer_id IN (
SELECT distinct customer_id FROM machine_bd
WHERE
churn30 is false AND f_act >= fecha_inicio
AND customer_id in (SELECT customer_id FROM mach
ine_cac WHERE migro = 'NO')
)
GROUP BY 1
ORDER BY 1
);
ELSE
-- TABLA CON CRITERIOS
DROP TABLE if exists machine_consulta_departamento;
CREATE TABLE machine_consulta_departamento as (
SELECT provincia_inicial as provincia
FROM machine_variables_alan
WHERE
n_decos_inicial = numerodecos
AND departamento_inicial = var_depa
AND customer_id IN (
SELECT distinct customer_id FROM machine_bd
WHERE
churn30 is false AND f_act >= fecha_inicio
AND customer_id in (SELECT customer_id FROM mach
ine_cac WHERE migro = 'NO')
)
GROUP BY 1
ORDER BY 1
);
END IF;
--######################################################################
################################################################################
##########
--BUCLE PRINCIPAL
drop sequence if exists machine_consulta_departamento_prov_id_seq;
create sequence machine_consulta_departamento_prov_id_seq;
FOR var_prov IN ( SELECT DISTINCT provincia from machine_consulta_depart
amento ORDER BY 1 ) LOOP
n_prov := nextval('machine_consulta_departamento_prov_id_seq');
INSERT INTO machine_departamento_provincias VALUES(null,n_depa,n
_prov,0,0,0,0,2,var_prov );
IF (numerodecos = 0) THEN
--TABLA TEMPORAL CON DATOS DEL DEALER
DROP TABLE IF EXISTS machine_departamento_provincias_tem
p;
CREATE TABLE machine_departamento_provincias_temp as (
SELECT f_base,f_act,count(customer_id)
FROM machine_bd
WHERE
churn30 is false AND f_act >= fecha_inic
io
AND customer_id in (SELECT customer_id F
ROM machine_cac WHERE migro = 'NO')
AND customer_id in (SELECT customer_id F
ROM machine_variables_alan
WHERE
departamento_inicial = var_dep
a
AND provincia_inicial = var_pr
ov
)
GROUP BY f_act,f_base ORDER BY f_base,f_act
);
ELSE
--TABLA TEMPORAL CON DATOS DEL DEALER
DROP TABLE IF EXISTS machine_departamento_provincias_tem
p;
CREATE TABLE machine_departamento_provincias_temp as (
SELECT f_base,f_act,count(customer_id)
FROM machine_bd
WHERE
churn30 is false AND f_act >= fecha_inic
io
AND customer_id in (SELECT customer_id F
ROM machine_cac WHERE migro = 'NO')
AND customer_id in (SELECT customer_id F
ROM machine_variables_alan
WHERE
n_decos_inicial = numerodecos
AND departamento_inicial = var
_depa
AND provincia_inicial = var_pr
ov
)
GROUP BY f_act,f_base ORDER BY f_base,f_act
);
END IF;
--INSERTANDO PARA QUE TODOS TENGAN MISMA CANTIDAD DE FIL
AS - COLUMNAS
INSERT INTO machine_departamento_provincias_temp (SELECT
f_base,f_act FROM machine_departamento_provincias_total WHERE f_base NOT IN (SE
LECT f_base FROM machine_departamento_provincias_temp) );
INSERT INTO machine_departamento_provincias_temp (SELECT
f_base,f_act FROM machine_departamento_provincias_total WHERE f_act NOT IN (SEL
ECT f_act FROM machine_departamento_provincias_temp) );
DROP SEQUENCE IF EXISTS seq_machine;
CREATE SEQUENCE seq_machine start 1;
--TABLA DINAMICA POR DEALER
INSERT INTO machine_departamento_provincias(
SELECT null, n_depa, n_prov, 0, 0, 0, nextval('seq_
machine')::int dato_id, 5, *
FROM crosstab(
'SELECT descripcion(f_act),descripcion(f_base)
,count n FROM machine_departamento_provincias_temp ORDER BY f_act,f_base',
'SELECT descripcion(f_base) FROM machine_depa
rtamento_provincias_temp GROUP BY f_base ORDER BY f_base'
) AS (
f_act varchar,
/*"Ene-12" varchar,"Feb-12" varchar,"Mar
-12" varchar,"Abr-12" varchar,"May-12" varchar,"Jun-12" varchar,"Jul-12" varchar
,
"Ago-12" varchar,"Sep-12" varchar,"Oct-1
2" varchar,"Nov-12" varchar,"Dic-12" varchar,
"Ene-13" varchar,"Feb-13" varchar,"Mar-1
3" varchar,"Abr-13" varchar,"May-13" varchar,"Jun-13" varchar,"Jul-13" varchar,
"Ago-13" varchar,"Sep-13" varchar,"Oct-1
3" varchar,"Nov-13" varchar,"Dic-13" varchar,*/
"Ene-14" varchar,"Feb-14" varchar,"Mar-1
4" varchar,"Abr-14" varchar,"May-14" varchar,"Jun-14" varchar,"Jul-14" varchar,
"Ago-14" varchar,"Sep-14" varchar,"Oct-1
4" varchar,"Nov-14" varchar,"Dic-14" varchar,
"Ene-15" varchar,"Feb-15" varchar,"Mar-1
5" varchar,"Abr-15" varchar,"May-15" varchar,"Jun-15" varchar,"Jul-15" varchar,
"Ago-15" varchar,"Sep-15" varchar,"Oct-1
5" varchar,"Nov-15" varchar,"Dic-15" varchar,
"Ene-16" varchar,"Feb-16" varchar,"Mar-1
6" varchar,"Abr-16" varchar,"May-16" varchar,"Jun-16" varchar,"Jul-16" varchar,
"Ago-16" varchar,"Sep-16" varchar
)
);
END LOOP;
END LOOP;
--######################################################################
################################################################################
##########

END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION machine_departamento_provincias() OWNER TO postgres;

Vous aimerez peut-être aussi