Somar resultados de uma consulta

Olá pessoal, eu estou com a seguinte query:

[code]SELECT distinct 1,‘jan’ as mes,
COUNT(CASE WHEN (JANEIRO.DTSOLICITACAO - JANEIRO.DTENVIOOPERADORA)<=3 THEN ‘DENTRO_PRAZO’ END) AS DENTRO_PRAZO,
COUNT(CASE WHEN (JANEIRO.DTSOLICITACAO - JANEIRO.DTENVIOOPERADORA)>3 THEN ‘FORA_PRAZO’ END) AS FORA_PRAZO

FROM EMP_MOVIMENTACAO JANEIRO, EMP_MOVREEMBOLSO MOV_REM

WHERE JANEIRO.CDMOVIMENTACAOSEQ = MOV_REM.CDMOVIMENTACAOSEQ AND
EXTRACT (MONTH FROM JANEIRO.DTSOLICITACAO) = 01 AND
EXTRACT (MONTH FROM JANEIRO.DTENVIOOPERADORA) = 01 AND
EXTRACT (YEAR FROM JANEIRO.DTSOLICITACAO) = ? AND
EXTRACT (YEAR FROM JANEIRO.DTSOLICITACAO) = EXTRACT (YEAR FROM JANEIRO.DTENVIOOPERADORA)

UNION

SELECT distinct 2,‘fev’ as mes,
COUNT(CASE WHEN (FEVEREIRO.DTSOLICITACAO - FEVEREIRO.DTENVIOOPERADORA)<=3 THEN ‘DENTRO_PRAZO’ END) AS DENTRO_PRAZO,
COUNT(CASE WHEN (FEVEREIRO.DTSOLICITACAO - FEVEREIRO.DTENVIOOPERADORA)>3 THEN ‘FORA_PRAZO’ END) AS FORA_PRAZO

FROM EMP_MOVIMENTACAO FEVEREIRO, EMP_MOVREEMBOLSO MOV_REM

WHERE FEVEREIRO.CDMOVIMENTACAOSEQ = MOV_REM.CDMOVIMENTACAOSEQ AND
EXTRACT (MONTH FROM FEVEREIRO.DTSOLICITACAO) = 02 AND
EXTRACT (MONTH FROM FEVEREIRO.DTENVIOOPERADORA) = 02 AND
EXTRACT (YEAR FROM FEVEREIRO.DTSOLICITACAO) = ? AND
EXTRACT (YEAR FROM FEVEREIRO.DTSOLICITACAO) = EXTRACT (YEAR FROM FEVEREIRO.DTENVIOOPERADORA)[/code]

esta query continua com UNIONS até dezembro, e eu precisava somar os atributos DENTRO_PRAZO e FORA_PRAZO de cada mês, para poder calcular a porcentagem entre os dois.
Por exemplo, se em Janeiro o DENTRO_PRAZO = 5 e FORA_PRAZO = 5, a porcentagem de cada um teria que me retornar 50%. (pode ser só o 50 mesmo)

Como que eu posso fazer isso ?
Esqueci de mensionar que o banco é o Oracle.
Muito Obrigado :slight_smile:

Já ouviste falar em GROUP BY? Isso dá para fazer com um único SELECT, sem UNION

[code]
SELECT EXTRACT (MONTH FROM mov.DTSOLICITACAO) as mes,
COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)<=3 THEN ‘DENTRO_PRAZO’ END) AS DENTRO_PRAZO,
COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)>3 THEN ‘FORA_PRAZO’ END) AS FORA_PRAZO

FROM EMP_MOVIMENTACAO mov, EMP_MOVREEMBOLSO MOV_REM

WHERE mov.CDMOVIMENTACAOSEQ = MOV_REM.CDMOVIMENTACAOSEQ AND
EXTRACT (MONTH FROM mov.DTSOLICITACAO) = EXTRACT (MONTH FROM mov.DTENVIOOPERADORA) AND
EXTRACT (YEAR FROM mov.DTSOLICITACAO) = ? AND
EXTRACT (YEAR FROM mov.DTSOLICITACAO) = EXTRACT (YEAR FROM mov.DTENVIOOPERADORA)

GROUP BY 1[/code]

Em relação à tua dúvida das percentagens:

[code]
SELECT EXTRACT (MONTH FROM mov.DTSOLICITACAO) as mes,
COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)<=3 THEN ‘DENTRO_PRAZO’ END) AS DENTRO_PRAZO,
COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)>3 THEN ‘FORA_PRAZO’ END) AS FORA_PRAZO,
COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)<=3 THEN ‘DENTRO_PRAZO’ END) 100 / count() AS DENTRO_PRAZO_PERC,
COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)>3 THEN ‘FORA_PRAZO’ END) 100 / count() AS FORA_PRAZO_PERC

FROM EMP_MOVIMENTACAO mov, EMP_MOVREEMBOLSO MOV_REM

WHERE mov.CDMOVIMENTACAOSEQ = MOV_REM.CDMOVIMENTACAOSEQ AND
EXTRACT (MONTH FROM mov.DTSOLICITACAO) = EXTRACT (MONTH FROM mov.DTENVIOOPERADORA) AND
EXTRACT (YEAR FROM mov.DTSOLICITACAO) = ? AND
EXTRACT (YEAR FROM mov.DTSOLICITACAO) = EXTRACT (YEAR FROM mov.DTENVIOOPERADORA)

GROUP BY 1[/code]

Fiz tudo sem testar pelo que pode haver algum erro…

Valew pela ajuda no GROUP BY, eu até o conhecia só que não estava conseguindo utilizar na minha query.
Só uma coisa na conta de porcentagem, ele está retornando 100 em qualquer tupla.

Por exemplo no meu banco, abril retorna 6 DENTRO_PRAZO e 6 FORA_PRAZO, então as porcentagens deste mês teriam que me retornar 50 em cada.

Valew

edit:

eu fiz uma solição provisória para isso:

COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)&lt;=3 THEN 1 ELSE 0 END) *100 / ( (COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)&lt;=3 THEN 1 ELSE 0 END)) + (COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)&gt;3 THEN 1 ELSE 0 END))) AS DENTRO_PRAZO_PERC, COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)&gt;3 THEN 1 ELSE 0 END) *100 / ( (COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)&lt;=3 THEN 1 ELSE 0 END)) + (COUNT(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)&gt;3 THEN 1 ELSE 0 END))) AS FORA_PRAZO_PERC

Só para registro mesmo, eu consegui o resultado que eu esperava, fazendo esta query:

[code]SELECT distinct 1,‘jan’ as mes,
(SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)<=3 THEN 1 ELSE 0 END)*100/ (CASE WHEN((SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)<=3 THEN 1 ELSE 0 END)) + (SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)>3 THEN 1 ELSE 0 END)))=0 THEN 1 ELSE ((SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)<=3 THEN 1 ELSE 0 END)) + (SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)>3 THEN 1 ELSE 0 END)))END)) AS DENTRO_PRAZO_PERC,
(SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)>3 THEN 1 ELSE 0 END)*100/ (CASE WHEN((SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)<=3 THEN 1 ELSE 0 END)) + (SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)>3 THEN 1 ELSE 0 END)))=0 THEN 1 ELSE ((SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)<=3 THEN 1 ELSE 0 END)) + (SUM(CASE WHEN (MOV.DTENVIOOPERADORA - MOV.DTSOLICITACAO)>3 THEN 1 ELSE 0 END)))END)) AS FORA_PRAZO_PERC

FROM EMP_MOVIMENTACAO MOV, EMP_MOVREEMBOLSO MOV_REM

WHERE MOV.CDMOVIMENTACAOSEQ = MOV_REM.CDMOVIMENTACAOSEQ AND
EXTRACT (MONTH FROM MOV.DTSOLICITACAO) = 01 AND
EXTRACT (MONTH FROM MOV.DTENVIOOPERADORA) = 01 AND
EXTRACT (YEAR FROM MOV.DTSOLICITACAO) = ? AND
EXTRACT (YEAR FROM MOV.DTSOLICITACAO) = EXTRACT (YEAR FROM MOV.DTENVIOOPERADORA)[/code]

pode não ser a melhor solução, mas foi a única que consegui. E sobre o uso do GROUP BY eu só não consegui o resultado esperado pois eu preciso que ele me retorne inclusive os meses onde não foram obtidas operações, só para registro no gráfico que montei no BIRT, por isso a solução utilizando UNION foi a única que encontrei.

Valew pessoal :smiley:

[code]
SELECT m.mes,
SUM(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)<=3 THEN 1 ELSE 0 END) AS DENTRO_PRAZO,
SUM(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)>3 THEN 1 ELSE 0 END) AS FORA_PRAZO,
SUM(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)<=3 THEN 1 ELSE 0 END) 100 / count() AS DENTRO_PRAZO_PERC,
SUM(CASE WHEN (mov.DTSOLICITACAO - mov.DTENVIOOPERADORA)>3 THEN 1 ELSE 0 END) 100 / count() AS FORA_PRAZO_PERC

FROM MESES m, outer (EMP_MOVIMENTACAO mov, EMP_MOVREEMBOLSO MOV_REM )

WHERE m.mes = EXTRACT (MONTH FROM mov.DTSOLICITACAO) AND
mov.CDMOVIMENTACAOSEQ = MOV_REM.CDMOVIMENTACAOSEQ AND
EXTRACT (MONTH FROM mov.DTSOLICITACAO) = EXTRACT (MONTH FROM mov.DTENVIOOPERADORA) AND
EXTRACT (YEAR FROM mov.DTSOLICITACAO) = ? AND
EXTRACT (YEAR FROM mov.DTSOLICITACAO) = EXTRACT (YEAR FROM mov.DTENVIOOPERADORA)

GROUP BY 1 [/code]

Onde meses é uma tabela que contém simplesmente os meses.
Assim já não precisas dos UNION e as percentagens já estão mais simples.