Duvida com Select - CASE

SQL Server

SQL

Firebird

26/05/2015

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

Curtidas 0

Melhor post

Fabiano Carvalho

Fabiano Carvalho

26/05/2015

Precisa fazer pivot.
Linhas torna-se colunas.
GOSTEI 1

Mais Respostas

Italo Pereira

Italo Pereira

26/05/2015

Cono faco?
GOSTEI 0
Italo Pereira

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?
GOSTEI 0
Marisiana Battistella

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

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

26/05/2015

Qual é o banco de dados que você está utilizando?
GOSTEI 1
Marcos P

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 !
GOSTEI 1
Marisiana Battistella

Marisiana Battistella

26/05/2015

Se for num relatório, pode-se utilizar uma tabela cruzada para apresentar esses dados...
GOSTEI 1
Italo Pereira

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.
GOSTEI 0
Alex Lekao

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.
GOSTEI 1
Italo Pereira

Italo Pereira

26/05/2015

isso mesmo alex, por isso estou pesquisando.
GOSTEI 0
Alex Lekao

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
GOSTEI 1
Italo Pereira

Italo Pereira

26/05/2015

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.
GOSTEI 0
Marcos P

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

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á ^^
GOSTEI 0
Marcos P

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...
GOSTEI 1
Italo Pereira

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.
GOSTEI 0
Alex Lekao

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.

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

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

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')
GOSTEI 1
Italo Pereira

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.
GOSTEI 0
Alex Lekao

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
GOSTEI 0
Italo Pereira

Italo Pereira

26/05/2015

Obrigado também Alex lekao, toda ajuda é sempre importante.

Sou grato a todos
GOSTEI 0
Alex Lekao

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.
GOSTEI 0
Marcos P

Marcos P

26/05/2015

Ótimo !
GOSTEI 0
Italo Pereira

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.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

26/05/2015

Obrigado também Alex lekao, toda ajuda é sempre importante.

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

Alex Lekao

26/05/2015

Legal.

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.
GOSTEI 0
POSTAR