Subtrair o resultado de dois selects

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Bom dia pessoal!!!

Estou com uma duvida que deve ser facil de ser resolvida.

Faço o seguinte select:

Selecionar tudo

SELECT Count(*)total FROM atendime WHERE cd_multi_empresa = 1  AND cd_tip_mar = 1 AND dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'
O Retorno é o valor 3000 por exemplo

Depois faço outro select:

Selecionar tudo

SELECT Count(*)total2 FROM atendime WHERE cd_multi_empresa = 1  AND cd_tip_RES = 30 AND dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'
que me retorna 1000 por exemplo

O que preciso é pegar o valor dos dois selects e realizar uma subtração.
Ex: 3000-1000=2000

o select que estou usando esta da seguinte forma:

Selecionar tudo

SELECT (total-total2) FROM(
SELECT Count(*)total FROM atendime WHERE cd_multi_empresa = 1  AND cd_tip_mar = 1 AND dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'
UNION ALL
SELECT Count(*)total2 FROM atendime WHERE cd_multi_empresa = 1  AND cd_tip_RES = 30 AND dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'
)
Mas da erro, fala que não localizou o identificador TOTAL2..

Por favor, HELP
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Opa Douglas,
você está cometendo 2 erros:
1- Ao fazer um UNION os campos precisam ter o mesmo nome. Então seu total2 deveria ser apenas total.

2- Union não te dará a diferença. você terá apenas 2 linhas.
- TOTAL
1-3000
2-1000
Logo fazer "(total-total2)" não retornará nada(dará erro). Teria que ser um "SUM(TOTAL)" onde você teria que ter sinal negativo no dado que quer subtrair(no caso -1000).

Mas dá uma olhada, vê se é o que você quer:

Selecionar tudo

SELECT COUNT(a1.cd_tip_res) T1
     , COUNT(a2.cd_tip_res) T2
     , COUNT(a1.cd_tip_res) - COUNT(a2.cd_tip_res) TOTAL
  FROM atendime a1
     , atendime a2
 WHERE and a2.cd_multi_empresa = a1.cd_multi_empresa
   AND a1.cd_multi_empresa = 1
   AND a1.cd_tip_res = 1
   AND a1.dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'   
   AND a2.cd_tip_res = 30
   AND a2.dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Noctifero bom dia...

Cara executei o select que você me passou e retorna os seguintes valores:

T1 T2 TOTAL
0 0 0

não esta pegando os valores
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

usando o código da seguinte maneira resultou um numero irreal

Selecionar tudo

SELECT COUNT(a1.cd_tip_res) T1
     , COUNT(a2.cd_tip_res) T2
     , COUNT(a1.cd_tip_res) - COUNT(a2.cd_tip_res) TOTAL
  FROM atendime a1
     , atendime a2
WHERE  --a2.cd_multi_empresa = a1.cd_multi_empresa
       a1.cd_multi_empresa = 1
   AND a1.cd_tip_mar= 1
   AND a1.dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'   
   AND a2.cd_multi_empresa = 1
   AND a2.dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'   
   AND a2.cd_tip_res = 30
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Desculpe, realmente mandei uma query errada.

Olhando bem, o que te interessa é a quantidade de linhas dependendo do "cd_tipo_res". Então você pode fazer o seguinte, de forma mais simples:

Selecionar tudo

SELECT COUNT(DECODE(a.cd_tip_res,1,1,0)
    - COUNT(DECODE(a.cd_tip_res,30,1,0) TOTAL
  FROM atendime a
 WHERE a.cd_multi_empresa = 1
   AND a.dt_atendimento BETWEEN '01/05/2012' AND '30/05/2012'
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes