Duvida com Query [Resolvido]

8 respostas
wagne23
Bom dia, tenho a seguinte query de consulta ao banco:
select
faprocad.cod_pro as Codigo,
faprocad.nome_pro as Profissional,
count(*) as Outubro

from faprocad,fapaccad

WHERE FAPROCAD.COD_PRO = FAPACCAD.COD_PRO
AND FAPACCAD.DATA_ENT >= '01/12/2009'
AND FAPACCAD.DATA_ENT <= '31/12/2009'
AND FAPACCAD.TIPO_PAC IN ('I')

group by faprocad.cod_pro,faprocad.nome_pro
order by faprocad.nome_pro

Mas preciso pegar os dados de varios meses, não so de outubro. Queria que gerasse algo tipo

Codigo   |   Profissional   |   Outubro   |   Novembro   | etc

É possivel fazer essa consutla?

8 Respostas

F

É possível sim, mas a sintaxe vai depender do banco de dados utilizado. No Postgresql seria assim:

select  
 faprocad.cod_pro as Codigo,  
 faprocad.nome_pro as Profissional,  
 COUNT(CASE WHEN EXTRACT(MONTH FROM FAPACCAD.DATA_ENT ) = 10 THEN 1 ELSE NULL END) as Outubro,  
 COUNT(CASE WHEN EXTRACT(MONTH FROM FAPACCAD.DATA_ENT ) = 11 THEN 1 ELSE NULL END) as Novembro  
   
 from faprocad,fapaccad  
   
 WHERE FAPROCAD.COD_PRO = FAPACCAD.COD_PRO  
 AND FAPACCAD.DATA_ENT >= '01/12/2009'  
 AND FAPACCAD.DATA_ENT <= '31/12/2009'  
 AND FAPACCAD.TIPO_PAC IN ('I')
wagne23

No caso eu estou usando o banco informix da ibm. Testei aqui o exemplo mas me retornou um erro.

Error: General error.Syntax error (State:37000, Native Code: FFFFD4CC)

F

Não conheço a sintaxe do Informix mas a query que postei estava faltando uma vírgula. Vi também que a função extract (para extrair campos da data) não existe no Informix mas sim as funções day, month, year, etc. Tente assim:

select  
 faprocad.cod_pro as Codigo,  
 faprocad.nome_pro as Profissional,  
 COUNT(CASE WHEN MONTH (FAPACCAD.DATA_ENT) = 10 THEN 1 ELSE NULL END) as Outubro,  
 COUNT(CASE WHEN MONTH (FAPACCAD.DATA_ENT) = 11 THEN 1 ELSE NULL END) as Novembro  
   
 from faprocad,fapaccad  
   
 WHERE FAPROCAD.COD_PRO = FAPACCAD.COD_PRO  
 AND FAPACCAD.DATA_ENT >= '01/12/2009'  
 AND FAPACCAD.DATA_ENT <= '31/12/2009'  
 AND FAPACCAD.TIPO_PAC IN ('I')
wagne23

Eu vi que estava sem a virgula, mas continuou com o mesmo erro.

wagne23

Alguem ai conhece informix?

F

Fiz uma pesquisa rápida e pelo que vi a função count do Informix não aceita uma expressão como no Postgresql e além disso não podemos usar uma subquery na clausula from, que seria uma segunda alternativa. Sendo assim a query fica mais complicada tendo
que ser divida em três etapas com uso de tabelas temporárias. Um detalhe importante desta estratégia é as três etapas devem ser executadas na mesma transação.

Veja se funciona assim:

Etapa1 - Contando por mês :
select  
 faprocad.cod_pro as Codigo,  
 faprocad.nome_pro as Profissional,  
 COUNT(*) as qt,
 MONTH (FAPACCAD.DATA_ENT)  as mes  
   
 from faprocad,fapaccad  
   
 WHERE FAPROCAD.COD_PRO = FAPACCAD.COD_PRO  
 AND FAPACCAD.DATA_ENT >= '01/01/2009'  
 AND FAPACCAD.DATA_ENT <= '31/12/2009'  
 AND FAPACCAD.TIPO_PAC IN ('I')  
GROUP BY  faprocad.cod_pro,  faprocad.nome_pro, MONTH (FAPACCAD.DATA_ENT)
INTO TEMP RESULT1;
Etapa2 - Classificando os meses:
select Codigo, Profissional, 
  case when mes = 1 THEN qt end as jan, 
  case when mes = 2 THEN qt end as fev,
  case when mes = 3 THEN qt end as mar,
  case when mes = 4 THEN qt end as abr,
  case when mes = 5 THEN qt end as mai,
  case when mes = 6 THEN qt end as jun,
  case when mes = 7 THEN qt end as jul,
  case when mes = 8 THEN qt end as ago,
  case when mes = 9 THEN qt end as set,
  case when mes = 10 THEN qt end as out,
  case when mes = 11 THEN qt end as nov,
  case when mes = 12 THEN qt end as dez
from RESULT1
INTO TEMP RESULT2;
Etapa3 - Agrupando o resultado:
select Codigo, Profissional, max(jan) as jan, max(fev) as fev, max(mar) as mar, max(abr) as abr, 
  max(mai) as mai max(jun) as jun, max(jul)  as jul,  max(ago) as ago, max(set) as set, max(out) as out, 
  max(nov) as nov, max(dez) as dez
from RESULT2
group by Codigo, Profissional;
pmlm

Mas o SUM aceita.

Pegando no SQL anterior:

select    
 faprocad.cod_pro as Codigo,    
 faprocad.nome_pro as Profissional,    
 SUM(CASE WHEN MONTH (FAPACCAD.DATA_ENT) = 10 THEN 1 ELSE 0 END) as Outubro,    
 SUM(CASE WHEN MONTH (FAPACCAD.DATA_ENT) = 11 THEN 1 ELSE 0 END) as Novembro    
      
 from faprocad,fapaccad    
      
 WHERE FAPROCAD.COD_PRO = FAPACCAD.COD_PRO    
 AND FAPACCAD.DATA_ENT BETWEEN '01/12/2009'   AND '31/12/2009'    
 AND FAPACCAD.TIPO_PAC = 'I'  
 group by faprocad.cod_pro,faprocad.nome_pro  
 order by faprocad.nome_pro
wagne23

Muito obrigado pela ajuda de todos. Fiz como o fbcarvalho disse e funcionou certo, e tambem fiz como o pmlm disse que é mais pratico. Valeu.

Criado 4 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 8
Participantes 3