Function com retorno dinâmico

04/09/2013

0

Olá gente!

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

Fafa

Responder

Posts

04/09/2013

David Sylvestre

Não entendi muito bem a pergunta. Seria para retornar um select?
Responder

04/09/2013

Fafa

Não sei se consigo direto com um select... Costumo salvar o sql em uma variável string e executar em um record...
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...
Responder

04/09/2013

Fabiano Carvalho

No sql, daria pra fazer utilizando PIVOT, linha torna-se colunas, no postgre não sei como seria feito isso, mas deve existir a mesma coisa, da uma pesquisada.
Responder

04/09/2013

Fabiano Carvalho

Veja se ajuda

http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/
Responder

04/09/2013

Fafa

Ok Fabiano, vou estudar o assunto depois retorno...

Obrigada.
Responder

05/09/2013

Jair N.

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?

Olá gente!

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!
Responder

05/09/2013

Fafa

Oi Jair.

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?
Responder

06/09/2013

Jair N.

Bom Dia, olha só para o PostgreSQL 9,..1 em diante já existe uma função pré-definada e só fazer do jeito que você achar melhor...

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.

Oi Jair.

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?
Responder

06/09/2013

Jair N.

Outra se sua versão for inferior tem uma função simples para isso,

-- 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++

Olá gente!

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!
Responder

06/09/2013

Fafa

Ok Jair, vou testar e qualquer dúvida posto...

Obrigada por enquanto.
Responder

06/09/2013

Fafa

A coluna retornada no exemplo que colocou é a coluna data, onde seus registros seriam as datas informadas nos parâmetros com o intervalo... mas na verdade preciso que as datas sejam as colunas:

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

Responder

06/09/2013

Jair N.

No PostgreSQL 9.1 procure a função CROSSTAB
Exemplo: SELECT * FROM crosstab ('SELECT func_periodo('||'2013-09-01'||','||'2013-09-30'||',1) AS datas');

Atc.

A coluna retornada no exemplo que colocou é a coluna data, onde seus registros seriam as datas informadas nos parâmetros com o intervalo... mas na verdade preciso que as datas sejam as colunas:

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

Responder

06/09/2013

Fafa

Não estou conseguindo executar o sql:
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?

Responder

06/09/2013

Jair N.

Boa tarde, você deve instalar a biblioteca "\\postgresql9\share\extension\"
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




Não estou conseguindo executar o sql:
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?

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar