SubQuery

08/09/2007

0

Ola Boa tarde galera!
to sofrendo mto aki com um select danado, e já quase doido, venho procurar ajuda hehe ...

Tenho um tabela que ja está estruturada e não podemos mais mexer nela, segue a estrutura principal:

[b]TAB_MOV[/b]
ID_MOV
HISTORICO
TIPO (0 OU 1 -- SE FOR 0 É ENTRADA, SE FOR 1 É SAIDA)
VALOR


Precisava que o SQL me retornasse alguma 2 Colunas:
(Entradas - Saidas) ... Preciso verificar, somar os valores agrupando pelo campo TIPO ...
Digamos que a tabela estivesse com os seguintes registros:
ID_MOV ---> HISTORICO ----> TIPO ---> VALOR 1................. TESTE................0..............5,00 2.................TESTE.................1..............10,00 3..................TESTE................0..............4,00


Assim, o SQL teria q me retornar isto:
Entradas --- Saidas 9,00 ..........10,00


alguem pode me ajudar ???


Output

Output

Responder

Posts

08/09/2007

Marcelo.bastos

Output,

abaixo vai um exemplo de como você pode conseguir esse resultado na consulta.

SELECT
SUM(CASE WHEN TIPO = 0 THEN VALOR END) AS Entradas,
SUM(CASE WHEN TIPO = 1 THEN VALOR END) AS Saidas
FROM TAB_MOV


Valeu!


Responder

11/09/2007

Output

ow ...
coisa fina [b:784a2d07cf]marcelo.bastos[/b:784a2d07cf]

vlw kra ... exatamente isto q eu procurava ...
abraço


Responder

11/09/2007

Output

Blz ... agora aproveitando tópico ...
outro select parecido ... Segue :

SELECT
 P.NOMEPLANODECONTAS,
 (CASE M.ID_PLANODECONTAS 
   WHEN 100 THEN 101
 ELSE
   M.ID_PLANODECONTAS  
 END) AS ID_PLANODECONTAS,

 SUM(CASE WHEN M.TIPO = 0 THEN M.VALOR END) AS ENTRADAS,
 SUM(CASE WHEN M.TIPO = 1 THEN M.VALOR END) AS SAIDAS

FROM
 MOVIMENTOLANC M
INNER JOIN
 TURNOS T
ON
 T.ID_TURNOS = M.ID_TURNOS
INNER JOIN
 PLANODECONTAS P
ON
 P.ID_PLANODECONTAS= M.ID_PLANODECONTAS
WHERE
 M.DTACONTA = ´2007-09-11´
 AND P.NOMEPLANODECONTAS LIKE ´¬VISA¬´
GROUP BY
 M.ID_PLANODECONTAS, P.NOMEPLANODECONTAS
ORDER BY 
 M.ID_PLANODECONTAS, P.NOMEPLANODECONTAS


Desta forma ele ta me retornando isto:
NOMEPLANODECONTAS - ID_PLANODECONTAS - ENTRADAS - SAIDAS DESPESAS CARTAO VISA - 101 - 2,55 CARTAO VISA - 101 - 99,45 CARTAO MASTERCARD - 130 - 30,00


Isto ta errado, como eu pedi pra agrupar por M.ID_PLANODECONTAS ele deveria somar os dois primeiros registros acima citados ....
Alguem poderia me ajudar nessa ????
PS: O Primeiro Registro tinha ID=100 porem foi covertido pra 101 no select acima usando o CASE


Responder

12/09/2007

Emerson Nascimento

veja se funciona: dê um nome diferente ao campo e tente agrupar por esse novo campo.
SELECT
 P.NOMEPLANODECONTAS,
 (CASE M.ID_PLANODECONTAS
   WHEN 100 THEN 101
 ELSE
   M.ID_PLANODECONTAS 
 END) AS IDPLANODECONTAS, -- note que não tem "_"

 SUM(CASE WHEN M.TIPO = 0 THEN M.VALOR ELSE 0.00 END) AS ENTRADAS,
 SUM(CASE WHEN M.TIPO = 1 THEN M.VALOR ELSE 0.00 END) AS SAIDAS

FROM
 MOVIMENTOLANC M
INNER JOIN
 TURNOS T
ON
 T.ID_TURNOS = M.ID_TURNOS
INNER JOIN
 PLANODECONTAS P
ON
 P.ID_PLANODECONTAS= M.ID_PLANODECONTAS
WHERE
 M.DTACONTA = ´2007-09-11´
 AND P.NOMEPLANODECONTAS LIKE ´¬VISA¬´
GROUP BY
 IDPLANODECONTAS, P.NOMEPLANODECONTAS
ORDER BY
 IDPLANODECONTAS, P.NOMEPLANODECONTAS


se isto não der certo, faça uso de sub-select:
SELECT
 NOMEPLANODECONTAS, ID_PLANODECONTAS,
 SUM(ENTRADAS) ENTRADAS, SUM(SAIDAS) SAIDAS
FROM
  (SELECT
   P.NOMEPLANODECONTAS,
   (CASE M.ID_PLANODECONTAS
     WHEN 100 THEN 101
   ELSE
     M.ID_PLANODECONTAS 
   END) AS ID_PLANODECONTAS,

   SUM(CASE WHEN M.TIPO = 0 THEN M.VALOR ELSE 0.00 END) AS ENTRADAS,
   SUM(CASE WHEN M.TIPO = 1 THEN M.VALOR ELSE 0.00 END) AS SAIDAS

  FROM
   MOVIMENTOLANC M
  INNER JOIN
   TURNOS T
  ON
   T.ID_TURNOS = M.ID_TURNOS
  INNER JOIN
   PLANODECONTAS P
  ON
   P.ID_PLANODECONTAS= M.ID_PLANODECONTAS
  WHERE
   M.DTACONTA = ´2007-09-11´
   AND P.NOMEPLANODECONTAS LIKE ´¬VISA¬´
  GROUP BY
   M.ID_PLANODECONTAS, P.NOMEPLANODECONTAS) TABELA_TEMP
GROUP BY
 NOMEPLANODECONTAS, ID_PLANODECONTAS
ORDER BY
 ID_PLANODECONTAS, NOMEPLANODECONTAS



Responder

12/09/2007

Output

Putz ... pior q naum deu cara ...
Deu Mesma coisa, ....

NOMEPLANODECONTAS ---- ID_PLANODECONTAS - ENTRADAS - SAIDAS DESPESAS CARTAO VISA - 101 ---------------------- 2,55 ---------0,00 CARTAO VISA - -------------101 -----------------------99,45---------0,00 CARTAO MASTERCARD -----130 -----------------------30,00--------0,00


To quase doido ja com isto hehee...
Desde ja agradeço


Responder

12/09/2007

Emerson Nascimento

não está funcionando por causa do campo NOMEPLANODECONTAS

tente assim:
SELECT
 max(NOMEPLANODECONTAS) NOMEPLANODECONTAS,
 ID_PLANODECONTAS,
 SUM(ENTRADAS) ENTRADAS, SUM(SAIDAS) SAIDAS
FROM
  (SELECT
   P.NOMEPLANODECONTAS,
   (CASE M.ID_PLANODECONTAS
     WHEN 100 THEN 101
   ELSE
     M.ID_PLANODECONTAS
   END) AS ID_PLANODECONTAS,

   SUM(CASE WHEN M.TIPO = 0 THEN M.VALOR ELSE 0.00 END) AS ENTRADAS,
   SUM(CASE WHEN M.TIPO = 1 THEN M.VALOR ELSE 0.00 END) AS SAIDAS

  FROM
   MOVIMENTOLANC M
  INNER JOIN
   TURNOS T
  ON
   T.ID_TURNOS = M.ID_TURNOS
  INNER JOIN
   PLANODECONTAS P
  ON
   P.ID_PLANODECONTAS= M.ID_PLANODECONTAS
  WHERE
   M.DTACONTA = ´2007-09-11´
   AND P.NOMEPLANODECONTAS LIKE ´¬VISA¬´
  GROUP BY
   M.ID_PLANODECONTAS, P.NOMEPLANODECONTAS) TABELA_TEMP
GROUP BY
 ID_PLANODECONTAS
ORDER BY
 1



Responder

12/09/2007

Output

Perfeito kra ...
vc salvou minha vida hehehehehe....
naum sabe o qto eu fiko agradecido por isto ...
Vc é mesmo mto fera!
Vlw msm ... Forte abraço,..


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar