Function com retorno dinâmico
04/09/2013
0
Existe alguma forma de criar uma function que retorna colunas dinâmicas? Preciso retornar as colunas conforme as datas informadas nos parâmetros. Por ex:
select * from f_DRE('2013-09-01', '2013-09-05'): Nessa consulta precisaria das seguintes colunas de retorno:
plano_contas
2013-09-01
2013-09-02
2013-09-03
2013-09-04
2013-09-05
Sendo que os valores nas colunas, são consultas complexas obtendo soma de valores... Não sei por onde começo...
A função seria para criar um relatório de DRE, ou seja, fluxo de caixa previsto e realizado...
Obrigada!
Fafa
Posts
04/09/2013
David Sylvestre
04/09/2013
Fafa
As colunas que serão retornadas da function, não vão ser as mesmas do select. No select vou obter somente os valores para preencher as colunas...
As colunas, conforme explique antes, preciso criar conforme as datas informadas nos parâmetros da função... que serão as datas propriamente ditas...
Não sei se consegui explicar direito...
04/09/2013
Fabiano Carvalho
04/09/2013
Fabiano Carvalho
http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/
05/09/2013
Jair N.
Existe alguma forma de criar uma function que retorna colunas dinâmicas? Preciso retornar as colunas conforme as datas informadas nos parâmetros. Por ex:
select * from f_DRE('2013-09-01', '2013-09-05'): Nessa consulta precisaria das seguintes colunas de retorno:
plano_contas
2013-09-01
2013-09-02
2013-09-03
2013-09-04
2013-09-05
Sendo que os valores nas colunas, são consultas complexas obtendo soma de valores... Não sei por onde começo...
A função seria para criar um relatório de DRE, ou seja, fluxo de caixa previsto e realizado...
Obrigada!
05/09/2013
Fafa
Isso mesmo. As colunas seriam as datas informadas mais o plano de contas. Queria buscar todos os valores direto na função...
Você tem algum exemplo que me ajude com ARRAY?
Obrigada.
Boa Tarde, olha só pelo que entendi você quer gerar seqüência de um determinado período, acho eu, o PostgreSQL trata os dados como um ARRAY, ao invés de PIVOT podendo ser gerado desta maneira, OU, nesta sua função acrescentar a data menor mais um até a data final, OU dinâmico, mas a que ponto? tenho vários bancos de dados em que trabalho, desde Oracle, SQLServer, Sybase, DB2 Etc . Para um fluxo de caixa, o que você está projetando? a soma? a ordenação? que uma função execute todo o processo para gerar o fluxo?
06/09/2013
Jair N.
Exemplo: SELECT generate_series(CAST('2013-09-01 00:00:00' AS TIMESTAMP),CAST('2013-09-30 23:59:58' AS TIMESTAMP),'1 day');
Atc.
Isso mesmo. As colunas seriam as datas informadas mais o plano de contas. Queria buscar todos os valores direto na função...
Você tem algum exemplo que me ajude com ARRAY?
Obrigada.
Boa Tarde, olha só pelo que entendi você quer gerar seqüência de um determinado período, acho eu, o PostgreSQL trata os dados como um ARRAY, ao invés de PIVOT podendo ser gerado desta maneira, OU, nesta sua função acrescentar a data menor mais um até a data final, OU dinâmico, mas a que ponto? tenho vários bancos de dados em que trabalho, desde Oracle, SQLServer, Sybase, DB2 Etc . Para um fluxo de caixa, o que você está projetando? a soma? a ordenação? que uma função execute todo o processo para gerar o fluxo?
06/09/2013
Jair N.
-- caso sua versão do PostgreSQL seja anterior utilize este aqui...
-- DROP FUNCTION func_periodo(inicial DATE, final DATE, intervalo INT);
CREATE OR REPLACE FUNCTION func_periodo(inicial DATE, final DATE, intervalo INT)
RETURNS SETOF DATE AS
$BODY$
SELECT generate_series(0,date_mi($2, $1),$3) + $1 AS periodo
$BODY$
LANGUAGE SQL VOLATILE;
executando: SELECT func_periodo('2013-09-01','2013-09-30',5) AS datas;
-- conforme eu disse antes um array de periodo...
SELECT ARRAY(SELECT func_periodo('2013-09-01','2013-09-30'));
Bem, é isso ai, se precisar de algo mais, e se eu tiver tempo...
Inte++
Existe alguma forma de criar uma function que retorna colunas dinâmicas? Preciso retornar as colunas conforme as datas informadas nos parâmetros. Por ex:
select * from f_DRE('2013-09-01', '2013-09-05'): Nessa consulta precisaria das seguintes colunas de retorno:
plano_contas
2013-09-01
2013-09-02
2013-09-03
2013-09-04
2013-09-05
Sendo que os valores nas colunas, são consultas complexas obtendo soma de valores... Não sei por onde começo...
A função seria para criar um relatório de DRE, ou seja, fluxo de caixa previsto e realizado...
Obrigada!
06/09/2013
Fafa
Obrigada por enquanto.
06/09/2013
Fafa
Por ex:
Tabela:
Plano de Contas | 2013-09-01 | 2013-09-06 | 2013-09-11 | 2013-09-16 | 2013-09-21 | 2013-09-26
01 RECEITAS | R$ 100 | R$ 127 | R$ 0 | R$ 300 | R$ 120 | R$ 279
01.01 VENDAS | R$ 156 | R$ 150 | R$ 0 | R$ 900 | R$ 20 | R$ 269
01.01.01 A VISTA | R$ 500 | R$ 127 | R$ 0 | R$ 400 | R$ 460 | R$ 279
01.01.02 A PRAZO | R$ 190 | R$ 827 | R$ 10 | R$ 560 | R$ 200 | R$ 179
02 DESPESAS | R$ 140 | R$ 127 | R$ 0 | R$ 300 | R$ 120 | R$ 79
Esse seria o retorno da função que preciso...
06/09/2013
Jair N.
Exemplo: SELECT * FROM crosstab ('SELECT func_periodo('||'2013-09-01'||','||'2013-09-30'||',1) AS datas');
Atc.
Por ex:
Tabela:
Plano de Contas | 2013-09-01 | 2013-09-06 | 2013-09-11 | 2013-09-16 | 2013-09-21 | 2013-09-26
01 RECEITAS | R$ 100 | R$ 127 | R$ 0 | R$ 300 | R$ 120 | R$ 279
01.01 VENDAS | R$ 156 | R$ 150 | R$ 0 | R$ 900 | R$ 20 | R$ 269
01.01.01 A VISTA | R$ 500 | R$ 127 | R$ 0 | R$ 400 | R$ 460 | R$ 279
01.01.02 A PRAZO | R$ 190 | R$ 827 | R$ 10 | R$ 560 | R$ 200 | R$ 179
02 DESPESAS | R$ 140 | R$ 127 | R$ 0 | R$ 300 | R$ 120 | R$ 79
Esse seria o retorno da função que preciso...
06/09/2013
Fafa
SELECT * FROM crosstab ('SELECT func_periodo('||'2013-09-01'||','||'2013-09-30'||',1) AS datas');
ERRO: uma lista de definição de colunas é requerida para funções que retornam "record"
LINE 1: SELECT * FROM crosstab ('SELECT func_periodo('||'2013-09-01'...
^
********** Error **********
ERRO: uma lista de definição de colunas é requerida para funções que retornam "record"
SQL state: 42601
Character: 15
O que há de errado?
06/09/2013
Jair N.
tablefunc--1.0.sql
tablefunc--unpackaged--1.0.sql
Essa biblioteca é que tem a função qualquer coisa consulte o site http://www.postgresql.org/docs/9.1/static/tablefunc.html
SELECT * FROM crosstab ('SELECT func_periodo('||'2013-09-01'||','||'2013-09-30'||',1) AS datas');
ERRO: uma lista de definição de colunas é requerida para funções que retornam "record"
LINE 1: SELECT * FROM crosstab ('SELECT func_periodo('||'2013-09-01'...
^
********** Error **********
ERRO: uma lista de definição de colunas é requerida para funções que retornam "record"
SQL state: 42601
Character: 15
O que há de errado?
Clique aqui para fazer login e interagir na Comunidade :)