Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 521015
            [titulo] => Duvida com Select - CASE
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-05-26 22:09:33
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 332951
            [status] => A
            [isExample] => 
            [NomeUsuario] => Fabiano Carvalho
            [Apelido] => FaabiianooC
            [Foto] => 332951_20140826143737.jpg
            [Conteudo] => Precisa fazer pivot.
Linhas torna-se colunas. ) )

Duvida com Select - CASE

Italo Pereira
   - 26 mai 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:
#Código

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.

Post mais votado

Faabiianooc
   - 26 mai 2015

Precisa fazer pivot.
Linhas torna-se colunas.

Italo Pereira
   - 26 mai 2015

Cono faco?

Italo Pereira
   - 27 mai 2015

o banco que preciso utilizar é firebird 1.6 :/

e nao posso usar um banco mais moderno.

existe alguma forma de fazer isso nele?

Marisiana
   - 27 mai 2015

Italo, o que precisa seria um select assim?

#Código

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

Italo Pereira
   - 27 mai 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

Marisiana
   - 27 mai 2015

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

Marcos P
   - 27 mai 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 !

Marisiana
   - 27 mai 2015

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

Italo Pereira
   - 27 mai 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.

Alex Lekao
   - 27 mai 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.

Italo Pereira
   - 27 mai 2015

isso mesmo alex, por isso estou pesquisando.

Alex Lekao
   - 27 mai 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

Italo Pereira
   - 27 mai 2015

fiz assim:

#Código

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.

Marcos P
   - 27 mai 2015

#Código

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

Italo Pereira
   - 27 mai 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á ^^

Marcos P
   - 27 mai 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...

Italo Pereira
   - 27 mai 2015

procurei por pivot no firebird e descobri que só é possivel a partir da versao 2
:/

mas to tentando encontrar outras solucoes.

Alex Lekao
   - 27 mai 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.

#Código

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.

Marisiana
   - 27 mai 2015

E se você fizer como no exemplo que você postou na tua pergunta, mas fazendo um CASE para cada mês?

Citação:
#Código

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

Faabiianooc
   - 27 mai 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')