Transformar Linhas em Colunas no Firebird

Firebird

20/09/2013

Pessoal alguém sabe como transformo linhas em colunas no firebird?

Vou aplicar em cima deste script:

Select extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') as DATA,
classecontabil.classecontabil,
SUM(despesas.valorliquido) AS TOTAL
from despesas inner join classecontabil
on despesas.idclassecontabil = classecontabil.idclassecontabil
where classecontabil.custofixoouvariavel = 'FIXO' and
despesas.datavencimento >= :datainicial and despesas.datavencimento <= :datafinal
GROUP BY DATA, classecontabil.classecontabil


Obrigado



Claudio Junior

Claudio Junior

Curtidas 0

Respostas

Claudio Junior

Claudio Junior

20/09/2013

Estou chegando perto, mas quero os valores da data dinâmicos entre a data inicial e final, sem precisar de vários iif

Select classecontabil.classecontabil,
SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/01',despesas.valorliquido, 0)) as "2013/01",

SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/02',despesas.valorliquido, 0)) as "2013/02",

SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/03',despesas.valorliquido, 0)) as "2013/03",

SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/04',despesas.valorliquido, 0)) as "2013/04"

from despesas inner join classecontabil
on despesas.idclassecontabil = classecontabil.idclassecontabil
where classecontabil.custofixoouvariavel = 'FIXO' and
despesas.datavencimento >= :datainicial and despesas.datavencimento <= :datafinal
GROUP BY DATA, classecontabil.classecontabil
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Estou chegando perto, mas quero os valores da data dinâmicos entre a data inicial e final, sem precisar de vários iif

Select classecontabil.classecontabil,
SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/01',despesas.valorliquido, 0)) as "2013/01",

SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/02',despesas.valorliquido, 0)) as "2013/02",

SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/03',despesas.valorliquido, 0)) as "2013/03",

SUM(IiF(extract(YEAR from despesas.datavencimento) || '/' ||
LPAD(extract(MONTH from despesas.datavencimento), 2,'0') = '2013/04',despesas.valorliquido, 0)) as "2013/04"

from despesas inner join classecontabil
on despesas.idclassecontabil = classecontabil.idclassecontabil
where classecontabil.custofixoouvariavel = 'FIXO' and
despesas.datavencimento >= :datainicial and despesas.datavencimento <= :datafinal
GROUP BY DATA, classecontabil.classecontabil
GOSTEI 0
Alex Lekao

Alex Lekao

20/09/2013

Oi Claudio, boa tarde!!!

Eu sei que no SQL Server tem isso mais pratico, eh o PIVOT ele ja traz todo o trampo pra vc.

No Caso do Firebird, dei uma boa pesquisando e apenas usando subselects e os dados acabam ficando fixos, por exemplo todos os meses, e os sem valores aparecerao vazios, todos os dias, todos os dias da semana.

Nao achei nada que fosse dinamico nao.

Acredito que possa nao ser possivel no Firebird ter isso mais dinamicamente ou de maneira mais pratica.

Provavelmente vc tera que montar uma SP para fazer a coleta dos dados e armazena como uma nota tabela temporaria na estrutura que vc quer.

Infelizmente nao poderei te ajudar nessa.

Boa Sorte.

Abraco.

Alex - Lekao
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Valeu, eu vou tentando, se conseguir a solução posto aqui.

Abraços


Oi Claudio, boa tarde!!!

Eu sei que no SQL Server tem isso mais pratico, eh o PIVOT ele ja traz todo o trampo pra vc.

No Caso do Firebird, dei uma boa pesquisando e apenas usando subselects e os dados acabam ficando fixos, por exemplo todos os meses, e os sem valores aparecerao vazios, todos os dias, todos os dias da semana.

Nao achei nada que fosse dinamico nao.

Acredito que possa nao ser possivel no Firebird ter isso mais dinamicamente ou de maneira mais pratica.

Provavelmente vc tera que montar uma SP para fazer a coleta dos dados e armazena como uma nota tabela temporaria na estrutura que vc quer.

Infelizmente nao poderei te ajudar nessa.

Boa Sorte.

Abraco.

Alex - Lekao
GOSTEI 0
Alex Lekao

Alex Lekao

20/09/2013

Otimo, vou acompanhar o Post para conhecimento.

Boa Sorte.

Abraco.

Alex - Lekao
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

No momento já consegui fazer o que queria criando um relatório de referência cruzada no FastReport usando o primeiro SQL que postei, mas se conseguir um código que faça isso dentro do próprio banco coloco aqui.
GOSTEI 0
Alex Lekao

Alex Lekao

20/09/2013

Legal.

Me interessei no assunto.

Ate falei com uns amigos que ja mexeram ou mexem como firebird e nao me disseram se seria possivel, alguns disseram que so com procedures e tal, mas nada conclusivo.

Acompanhando o post.
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Ainda não cheguei a uma conclusão significativa, tentei list com subquerys mas ainda não deu certo. Mas tenho certeza que existe alguma procedure que vai resolver.
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Ainda não cheguei a uma conclusão significativa, tentei list com subquerys mas ainda não deu certo. Mas tenho certeza que existe alguma procedure que vai resolver.
GOSTEI 0
Layla Pontes

Layla Pontes

20/09/2013

nossa, isso é bem complexo pra mim que estou começando, ^^
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Se precisar de ajuda em algo é só falar :)

nossa, isso é bem complexo pra mim que estou começando, ^^
GOSTEI 0
Zilon Maciel

Zilon Maciel

20/09/2013

Fica filé, usando o comando Case...
GOSTEI 0
Alex Lekao

Alex Lekao

20/09/2013

opa... nao sei extamente do case, o seu funcionamento, mas ele acaba ficando fixo as colunas.

o ideal eh usar o PIVOT, esse eu sei que tem no SQL Server, e faz exatamente isso, de transformar as linhas em colunas.

se nao me engano existe alguma coisa que da para fazer que deixa as colunas dinamicas, nao lembro exatamente se eh com funcao ou com procedure, ja vi muito issos na internet ajudando a fazer, mas era em SQL Server.

Abraco.
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Em Sql Server eu consigo fazer, só não dá certo em Firebird, valeu.
GOSTEI 0
Claudio Junior

Claudio Junior

20/09/2013

Em Sql Server eu consigo fazer, só não dá certo em Firebird, valeu.
GOSTEI 0
Anderson

Anderson

20/09/2013

Galera eu fiz assim, como os meses são fixos fiz subqueries e o ano deixei como parametro.

select
first 1 (select sum(o.valorinicial) from orcamento o where extract(month from o.data) = 1) Janeiro,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 2) Fevereiro,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 3) Marco,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 4) Abril,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 5) Maio,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 6) Junho,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 7) Julho,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 8) Agosto,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 9) Setembro,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 10) Outubro,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 11) Novembro,
(select coalesce(sum(o.valorinicial),0) from orcamento o where extract(year from o.data) = :ano and extract(month from o.data) = 12) Dezembro
from orcamento o
GOSTEI 0
POSTAR