Duvida com Select - CASE
oi,
tenho uma tabela assim:
Profissional - Quantidade - Mês
Nutricionista- 50 - JAN
Nutricionista- 56 - FEV
Nutricionista- 78 - MAR
Nutricionista- 23 - FEV
Medico - 33 - JAN
Enfermeiro - 44 - JAN
Medico - 73 - FEV
Medico - 23 - MAR
Enfermeiro - 24 - JAN
Enfermeiro - 44 - MAR
Como eu crio um comando SELECT para obter a soma dos profissionais por mês?
Profissional - JAN - FEV - MAR
Nutricionista- 50 - 79 - 78
Tentei assim:
ele me retorna assim:
Profissional - JAN - FEV - MAR
Nutricionista- 50 - 0 - 0
Nutricionista- 0 - 79 - 0
Nutricionista- 0 - 0 - 78
alguem pode me ajudar?
abraço.
tenho uma tabela assim:
Profissional - Quantidade - Mês
Nutricionista- 50 - JAN
Nutricionista- 56 - FEV
Nutricionista- 78 - MAR
Nutricionista- 23 - FEV
Medico - 33 - JAN
Enfermeiro - 44 - JAN
Medico - 73 - FEV
Medico - 23 - MAR
Enfermeiro - 24 - JAN
Enfermeiro - 44 - MAR
Como eu crio um comando SELECT para obter a soma dos profissionais por mês?
Profissional - JAN - FEV - MAR
Nutricionista- 50 - 79 - 78
Tentei assim:
select (case mes when 'JAN' then sum(quantidade) else 0 end), (case mes when 'FEV' then sum(quantidade) else 0 end), (case mes when 'MAR' then sum(quantidade) else 0 end) from producao where profissional = 'NUTRICIONISTA' group by mes
ele me retorna assim:
Profissional - JAN - FEV - MAR
Nutricionista- 50 - 0 - 0
Nutricionista- 0 - 79 - 0
Nutricionista- 0 - 0 - 78
alguem pode me ajudar?
abraço.
Italo Pereira
Curtidas 0
Melhor post
Fabiano Carvalho
26/05/2015
Precisa fazer pivot.
Linhas torna-se colunas.
Linhas torna-se colunas.
GOSTEI 1
Mais Respostas
Italo Pereira
26/05/2015
Cono faco?
GOSTEI 0
Fabiano Carvalho
26/05/2015
GOSTEI 1
Italo Pereira
26/05/2015
o banco que preciso utilizar é firebird 1.6 :/
e nao posso usar um banco mais moderno.
existe alguma forma de fazer isso nele?
e nao posso usar um banco mais moderno.
existe alguma forma de fazer isso nele?
GOSTEI 0
Marisiana Battistella
26/05/2015
Italo, o que precisa seria um select assim?
select p.profissional, p.mes, SUM(p.quantidade) as quantidade from producao p where p.profissional = 'NUTRICIONISTA' and p.mes = 1 --- utilize se precisar filtrar os dados de um determinado mês group by p.profissional, p.mes order by p.profissional, p.mes
GOSTEI 1
Italo Pereira
26/05/2015
funciona, mas lista assim:
profissional - mes - quant
nutricionista- JAN- 10
nutricionista- FEV- 08
nutricionista- MAR- 20
preciso assim:
profissional - JAN - FEV - MAR
nutricionista- 10 - 08 - 20
profissional - mes - quant
nutricionista- JAN- 10
nutricionista- FEV- 08
nutricionista- MAR- 20
preciso assim:
profissional - JAN - FEV - MAR
nutricionista- 10 - 08 - 20
GOSTEI 0
Marisiana Battistella
26/05/2015
Qual é o banco de dados que você está utilizando?
GOSTEI 1
Marcos P
26/05/2015
Italo,
Pesquise sobre "firebird pivot query", você vai achar material na web sobre isso...
Qual o destino desses dados, serão tratados em algum programa ?
O custo de fazer isso no banco não vale a pena... pegue esse formato indicado pela Marisiana e trate isso do lado da aplicação, é bem mais simples !
Pesquise sobre "firebird pivot query", você vai achar material na web sobre isso...
Qual o destino desses dados, serão tratados em algum programa ?
O custo de fazer isso no banco não vale a pena... pegue esse formato indicado pela Marisiana e trate isso do lado da aplicação, é bem mais simples !
GOSTEI 1
Marisiana Battistella
26/05/2015
Se for num relatório, pode-se utilizar uma tabela cruzada para apresentar esses dados...
GOSTEI 1
Italo Pereira
26/05/2015
vou pesquisar por pivot firebird, uso banco firebird 1.6, ja pensei em fazer isso do lado aplicação, estou usando quickreport pra mostrar os dados e ele é um pouco limitado quanto a alguns recursos.
mas to tentando. sou grato a todos que estão me ajudando, cada dica é sempre válida.
mas to tentando. sou grato a todos que estão me ajudando, cada dica é sempre válida.
GOSTEI 0
Alex Lekao
26/05/2015
ate onde sei, e so sei que nada sei. rsrsr, firebird nao tem essa opcao do pivot, vc tera que montar toda uma estrutura a parte para fazer isso, ou criar algum tipo de function ou procedure.
abraco.
abraco.
GOSTEI 1
Italo Pereira
26/05/2015
isso mesmo alex, por isso estou pesquisando.
GOSTEI 0
Alex Lekao
26/05/2015
rapaz talves vc consiga fazer com algum select aninhado e tal.
mas as colunas ficarao fixas e dos 12 meses.
isso se nao for usar o select aninhado.
no sql server tem um recurso que da muito ganho de desempenho que eh o "partiction by" ele aumenta o desempenho de alguns calculos sem precisar fazer muito malabarismo, nao sei se tem no firebird, mas como uso pouco nao lembro de cor a sintexa e como tbm nao analisei a fundo o que vc precisa nao mencionei nenhuma solucao possivel. rsrsr
boa sorte.
abraco
mas as colunas ficarao fixas e dos 12 meses.
isso se nao for usar o select aninhado.
no sql server tem um recurso que da muito ganho de desempenho que eh o "partiction by" ele aumenta o desempenho de alguns calculos sem precisar fazer muito malabarismo, nao sei se tem no firebird, mas como uso pouco nao lembro de cor a sintexa e como tbm nao analisei a fundo o que vc precisa nao mencionei nenhuma solucao possivel. rsrsr
boa sorte.
abraco
GOSTEI 1
Italo Pereira
26/05/2015
fiz assim:
tá me retornando assim:
profissional - JAN - FEV - MAR
nutricionista- 200- 200- 200
enfermeiro - 200- 200- 200
medico - 200- 200- 200
ele está na estrutura que eu quero, mas está somando todos os campos. estou quase acertando, se tiverem mais uma dica, serei grato.
select distinct(profissional), (select sum(quantidade) from producao where mes = 'JAN' group by mes) JAN, (select sum(quantidade) from producao where mes = 'JAN' group by mes) JAN, (select sum(quantidade) from producao where mes = 'JAN' group by mes) JAN from producao where (mes = 'JAN' or mes = 'FEV' or mes = 'MAR')
tá me retornando assim:
profissional - JAN - FEV - MAR
nutricionista- 200- 200- 200
enfermeiro - 200- 200- 200
medico - 200- 200- 200
ele está na estrutura que eu quero, mas está somando todos os campos. estou quase acertando, se tiverem mais uma dica, serei grato.
GOSTEI 0
Marcos P
26/05/2015
select distinct(profissional), (select sum(quantidade) from producao where mes = 'JAN' group by mes) JAN, (select sum(quantidade) from producao where mes = 'FEV' group by mes) FEV, (select sum(quantidade) from producao where mes = 'MAR' group by mes) MAR from producao where (mes = 'JAN' or mes = 'FEV' or mes = 'MAR')
GOSTEI 1
Italo Pereira
26/05/2015
ele agora tá dando o resultado:
profissional - JAN - FEV - MAR
nutricionista- 200- 250- 300
enfermeiro - 200- 250- 300
medico - 200- 250- 300
ou seja, ele soma o valor dos tres profissionais, mas agora por mês.
estamos quase lá ^^
profissional - JAN - FEV - MAR
nutricionista- 200- 250- 300
enfermeiro - 200- 250- 300
medico - 200- 250- 300
ou seja, ele soma o valor dos tres profissionais, mas agora por mês.
estamos quase lá ^^
GOSTEI 0
Marcos P
26/05/2015
Não vai funcionar assim... pois você não consegue individualizar os profissionais nas subqueries, sem "abrir" novas linhas no resultado !
Não existe solução trivial para isso !
Pesquise sobre "pivot" no firebird...
Não existe solução trivial para isso !
Pesquise sobre "pivot" no firebird...
GOSTEI 1
Italo Pereira
26/05/2015
procurei por pivot no firebird e descobri que só é possivel a partir da versao 2
:/
mas to tentando encontrar outras solucoes.
:/
mas to tentando encontrar outras solucoes.
GOSTEI 0
Alex Lekao
26/05/2015
coloque no where de cada subselect uma relacao com o select principal, coloque apelidos para cada tabela para ficar melhor de fazer, ai fica tipo where p.profissional = p1.profissional, e isso na subselect, ele vai dar uma isolada nesse resultado que vc quer.
nao sei se vai funcionar, mas testa ae.
nunca fiz isso no firebird, faco sempre no sql e funciona balinha.
provavelmente vai ficar lento, mas vamos ver no que da, pelo menos resolve a questao no mais urgente, ai vc tera que procurar sobre pivot para melhorar a performance.
abraco.
nao sei se vai funcionar, mas testa ae.
select distinct(p.profissional), (select sum(p1.quantidade) from producao as p1 where p1.mes = 'JAN' and p1.profissional =p.profissional group by p1.mes) JAN, (select sum(p2.quantidade) from producao as p2 where p2.mes = 'FEV' and p2.profissional =p.profissional group by p2.mes) FEV, (select sum(p3.quantidade) from producao as p3 where p3.mes = 'MAR' and p3.profissional =p.profissional group by p3.mes) MAR from producao as p where (p.mes = 'JAN' or p.mes = 'FEV' or p.mes = 'MAR')
nunca fiz isso no firebird, faco sempre no sql e funciona balinha.
provavelmente vai ficar lento, mas vamos ver no que da, pelo menos resolve a questao no mais urgente, ai vc tera que procurar sobre pivot para melhorar a performance.
abraco.
GOSTEI 1
Marisiana Battistella
26/05/2015
E se você fizer como no exemplo que você postou na tua pergunta, mas fazendo um CASE para cada mês?
select (case mes when 'JAN' then sum(quantidade) else 0 end), (case mes when 'FEV' then sum(quantidade) else 0 end), (case mes when 'MAR' then sum(quantidade) else 0 end) from producao where profissional = 'NUTRICIONISTA' group by mes
GOSTEI 1
Fabiano Carvalho
26/05/2015
select distinct(profissional),
(select sum(quantidade)
from producao as Pod1
where mes = 'JAN'
and pod.profissional = Pod1.profissional
group by mes) JAN,
(select sum(quantidade)
from producao as Pod2
where mes = 'JAN'
and pod.profissional = Pod2.profissional
group by mes) JAN,
(select sum(quantidade)
from producao as Pod3
where mes = 'JAN'
and pod.profissional = Pod3.profissional
group by mes) JAN
from producao as Pod
where
(mes = 'JAN' or
mes = 'FEV' or
mes = 'MAR')
(select sum(quantidade)
from producao as Pod1
where mes = 'JAN'
and pod.profissional = Pod1.profissional
group by mes) JAN,
(select sum(quantidade)
from producao as Pod2
where mes = 'JAN'
and pod.profissional = Pod2.profissional
group by mes) JAN,
(select sum(quantidade)
from producao as Pod3
where mes = 'JAN'
and pod.profissional = Pod3.profissional
group by mes) JAN
from producao as Pod
where
(mes = 'JAN' or
mes = 'FEV' or
mes = 'MAR')
GOSTEI 1
Italo Pereira
26/05/2015
FaabiianooC, valewwww cara, funcionou perfeitamente.
eu até tinha pensado nisso de ligar o profissional do select interno com o do select principal, mas não sabia como fazer.
agora é só fazer alguns ajustes aqui.
fico muito grato mesmo.
eu até tinha pensado nisso de ligar o profissional do select interno com o do select principal, mas não sabia como fazer.
agora é só fazer alguns ajustes aqui.
fico muito grato mesmo.
GOSTEI 0
Alex Lekao
26/05/2015
kkkkkkk
so agora que vi que o fabiano havia sugerido o que sugeri.
kkkkkkkk
eh isso que da so passar o olho nas respostas da galera.
kkkkkkkkkkkkkk
so agora que vi que o fabiano havia sugerido o que sugeri.
kkkkkkkk
eh isso que da so passar o olho nas respostas da galera.
kkkkkkkkkkkkkk
GOSTEI 0
Italo Pereira
26/05/2015
Obrigado também Alex lekao, toda ajuda é sempre importante.
Sou grato a todos
Sou grato a todos
GOSTEI 0
Alex Lekao
26/05/2015
sem crise, eu fui na febre para tentar ajudar, pq ja passei por isso aqui onde trabalho entao estava familiarizado, no sql server, ai acabei nao me atentando a sugestao do Fabiano.
e Cara, vc recebeu uma dica dum cara que eh muito bom nessa parada de banco de dados.
aqui no forum temos muita gente boa.
Abraco.
e Cara, vc recebeu uma dica dum cara que eh muito bom nessa parada de banco de dados.
aqui no forum temos muita gente boa.
Abraco.
GOSTEI 0
Marcos P
26/05/2015
Ótimo !
GOSTEI 0
Italo Pereira
26/05/2015
Realmente conheci muita gente boa em fóruns pela internet.
Atualmente estou andando mais em fóruns de desenvolvimento de jogos, e procuro sempre ajudar no que posso, pois também já passei por muito sufoco com alguns códigos. Kkkk.
Atualmente estou andando mais em fóruns de desenvolvimento de jogos, e procuro sempre ajudar no que posso, pois também já passei por muito sufoco com alguns códigos. Kkkk.
GOSTEI 0
Marisiana Battistella
26/05/2015
Obrigado também Alex lekao, toda ajuda é sempre importante.
Sou grato a todos
Sou grato a todos
Por nada Italo!
Sempre é bom participar dos fóruns, eu mesma já aprendi muito com o pessoal aqui...!
GOSTEI 0
Alex Lekao
26/05/2015
Legal.
Boa sorte com o seu trabalho.
abraco.
Boa sorte com o seu trabalho.
abraco.
Realmente conheci muita gente boa em fóruns pela internet.
Atualmente estou andando mais em fóruns de desenvolvimento de jogos, e procuro sempre ajudar no que posso, pois também já passei por muito sufoco com alguns códigos. Kkkk.
Atualmente estou andando mais em fóruns de desenvolvimento de jogos, e procuro sempre ajudar no que posso, pois também já passei por muito sufoco com alguns códigos. Kkkk.
GOSTEI 0