Duvida com Select - CASE

26/05/2015

0

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:

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

Italo Pereira

Responder

Post mais votado

26/05/2015

Precisa fazer pivot.
Linhas torna-se colunas.

Fabiano Carvalho

Fabiano Carvalho
Responder

Mais Posts

26/05/2015

Italo Pereira

Cono faco?
Responder

27/05/2015

Italo Pereira

o banco que preciso utilizar é firebird 1.6 :/

e nao posso usar um banco mais moderno.

existe alguma forma de fazer isso nele?
Responder

27/05/2015

Marisiana Battistella

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
Responder

27/05/2015

Italo Pereira

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
Responder

27/05/2015

Marisiana Battistella

Qual é o banco de dados que você está utilizando?
Responder

27/05/2015

Marcos P

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

27/05/2015

Marisiana Battistella

Se for num relatório, pode-se utilizar uma tabela cruzada para apresentar esses dados...
Responder

27/05/2015

Italo Pereira

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

27/05/2015

Alex Lekao

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

27/05/2015

Italo Pereira

isso mesmo alex, por isso estou pesquisando.
Responder

27/05/2015

Alex Lekao

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
Responder

27/05/2015

Italo Pereira

fiz assim:

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

27/05/2015

Marcos P

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')
Responder

27/05/2015

Italo Pereira

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á ^^
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar