Transformar Linhas em Colunas no Firebird
Pessoal alguém sabe como transformo linhas em colunas no firebird?
Vou aplicar em cima deste script:
Obrigado
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
Curtidas 0
Respostas
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
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
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
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
20/09/2013
Valeu, eu vou tentando, se conseguir a solução posto aqui.
Abraços
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
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
20/09/2013
Otimo, vou acompanhar o Post para conhecimento.
Boa Sorte.
Abraco.
Alex - Lekao
Boa Sorte.
Abraco.
Alex - Lekao
GOSTEI 0
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
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.
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
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
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
20/09/2013
nossa, isso é bem complexo pra mim que estou começando, ^^
GOSTEI 0
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
20/09/2013
Fica filé, usando o comando Case...
GOSTEI 0
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.
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
20/09/2013
Em Sql Server eu consigo fazer, só não dá certo em Firebird, valeu.
GOSTEI 0
Claudio Junior
20/09/2013
Em Sql Server eu consigo fazer, só não dá certo em Firebird, valeu.
GOSTEI 0
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
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