Function com retorno dinâmico
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!
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
Curtidas 0
Respostas
David Sylvestre
04/09/2013
Não entendi muito bem a pergunta. Seria para retornar um select?
GOSTEI 0
Fafa
04/09/2013
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...
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...
GOSTEI 0
Fabiano Carvalho
04/09/2013
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.
GOSTEI 0
Fabiano Carvalho
04/09/2013
Veja se ajuda
http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/
http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/
GOSTEI 0
Fafa
04/09/2013
Ok Fabiano, vou estudar o assunto depois retorno...
Obrigada.
Obrigada.
GOSTEI 0
Jair N.
04/09/2013
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!
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!
GOSTEI 0
Fafa
04/09/2013
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?
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?
GOSTEI 0
Jair N.
04/09/2013
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.
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?
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?
GOSTEI 0
Jair N.
04/09/2013
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++
-- 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!
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!
GOSTEI 0
Fafa
04/09/2013
Ok Jair, vou testar e qualquer dúvida posto...
Obrigada por enquanto.
Obrigada por enquanto.
GOSTEI 0
Fafa
04/09/2013
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...
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...
GOSTEI 0
Jair N.
04/09/2013
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.
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...
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...
GOSTEI 0
Fafa
04/09/2013
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?
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?
GOSTEI 0
Jair N.
04/09/2013
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
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?
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?
GOSTEI 0