Contar qtde de registros num mesmo SELECT com condições dife

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Galera, acredito que tenha outro jeito de fazer algo parecido do que eu fiz abaixo:

Selecionar tudo


select  A16.*
       ,CASE WHEN (      A16.AUTORIZA IS NULL 
                    AND ( SELECT COUNT(*)
					        FROM OWNER.TABELA 
						   WHERE CAMPO1    = 1 
						     AND CAMPO2 = '2171200006643' 
							 AND NUM_RIESGO = 470 ) <>  ( SELECT COUNT(*) 
							                                FROM OWNER.TABELA
														   WHERE CAMPO1 = 1 
														     AND CAMPO2 = '2171200006643' 
															 AND RISCO = 470 
															 AND AUTORIZA = 'S' ) 
                   ) THEN 'FALHA NA APROVAÇÃO'
                     ELSE 'APROVADO'            
        END ANALISE
  from OWNER.TABELA A16
 where A16.CAMPO1    = 1 
   and A16.CAMPO2 = '2171200006643'
   AND A16.RISCO  = 470



Neste caso, trata-se de uma tabela de parametrização que indica se determinado processo foi finalizado com sucesso ou não. Caso ele tenha sido finalizado com sucesso o campo AUTORIZA é preenchido e o que eu pretendia com este script era verificar se a quantidade de registros para determinada chave é mesma quantidade para os mesmos registros que possuem o referido campo preenchido, isto porque todos os campo são listados independentes de terem sido preenchidos ou não. Dai eu pego e comparo as duas quantidades, se as mesmas forem iguais isto indica que todos os registros foram aprovados, ou autorizado.

Bem, talvez alguém questione: Mas por quê você não traz apenas os campos preenchidos então?

Por que eu preciso saber os campos que não foram preenchidos também, porque é gerado um código de erro. Eu estou apenas tentando facilitar a análise uma vez que temos que analisar uma sequencia de várias tabelas e algumas flags em específico.

Não sei se ficou claro, deu pra entender? Será que o CUBE ou o ROLLUP ajudaria neste caso?

Se alguém tiver alguma sugestão, fico no aguardo.

Desde já agradeço.

Att.,
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Oi Tinho,

Não tenho como avaliar se as minhas queries estão corretas 100%, mas você pode testar uma das opções abaixo:

Selecionar tudo

  SELECT COUNT(*) AS TOTAL,
         SUM(CASE WHEN AUTORIZA = 'S' THEN 1 ELSE 0 END) AS AUTORIZADO  
    FROM OWNER.TABELA
   WHERE CAMPO1 = 1 
     AND CAMPO2 = '2171200006643' 
     AND RISCO = 470

Selecionar tudo

SELECT CASE (COUNT(*) - SUM(CASE WHEN AUTORIZA = 'S' THEN 1 ELSE 0 END)) <> 0 THEN 'FALHA NA APROVACAO' ELSE 'APROVADO' END AS STATUS
    FROM OWNER.TABELA
   WHERE CAMPO1 = 1 
     AND CAMPO2 = '2171200006643' 
     AND RISCO = 470

Selecionar tudo

  SELECT CAMPO1,CAMPO2,RISCO,
      COUNT(*) AS TOTAL,
     SUM(CASE WHEN AUTORIZA = 'S' THEN 1 ELSE 0 END) AS AUTORIZADO  
        FROM OWNER.TABELA
      GROUP BY CAMPO1,CAMPO2,RISCO

Selecionar tudo

  SELECT CAMPO1,CAMPO2,RISCO,
      CASE (COUNT(*) - SUM(CASE WHEN AUTORIZA = 'S' THEN 1 ELSE 0 END)) <> 0 THEN 'FALHA NA APROVACAO' ELSE 'APROVADO' END AS STATUS
        FROM OWNER.TABELA
      GROUP BY CAMPO1,CAMPO2,RISCO


Não sei se você realmente precisaria usar ROLLUP ou CUBE. Mas pode ser que os outros foristas tenham uma opinião diferente.

Abraços,

Sergio Coutinho
Responder
  • Informação