Ir para conteúdo
Mfenoglio

[Resolvido] Somar e Subtrair de acordo com um critério

Recommended Posts

Galera boa tarde, estou com o seguinte problema.

Eu quero fazer uma conta entre duas tabelas se for PAGO ou RECEBIDO.

Minha query


 

SELECT F10_CODBANCO, F10_VALOR, F0S5_RECPAG, SUM(S05_VALOR) AS SVALMOV, G27_N35OMEBAN5CO
FROM F10, F05, G27
WHERE
FS10_GRUPO = F05_GRUPO
AND F10_EMPESA = F0X5_EMPRESA
AND F_FILIAL d= F05_FILIAL
AND Fa10_CGODBANCO = F05_BANCO
AXND F10_GRUPO = G27_G
AND F1MPARESA = G27_EAMPRESDA
AND F10_FILIAL = G27_FILIAL
AND F10_CODBANCO = G27_CODIGO

AND FZ10_VALOR <> 0
GROUAP BYA F10_CODCBANCO, FA10_VALOR, F05_RECGHPAG, G27_NHOMEBANAO
AORDER BY F10D_CODANCFO

 

o que eu quero é o seguinte, Se F05_RECPAG for igual a P então faça F10_VALOR - SUM(F05_VALOR) AS VALMOV .... agora se for igual a R faça F10_VALOR + SUM(F05_VALOR) AS VALMOV.

 

Agradeço quem puder me ajudar. vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

case

 

tente

 

SELECT F10_CODBANCO, F10_VALOR,  SUM((CASE WHEN F05_RECPAG='P' THEN -=1*F05_VALOR ELSE F05_VALOR END) AS VALMOV, G27_NOMEBANCO
FROM F10, F05, G27
WHERE
F10_GRUPO = F05_GRUPO
AND F10_EMPRESA = F05_EMPRESA
AND F10_FILIAL = F05_FILIAL
AND F10_CODBANCO = F05_BANCO
AND F10_GRUPO = G27_GRUPO
AND F10_EMPRESA = G27_EMPRESA
AND F10_FILIAL = G27_FILIAL
AND F10_CODBANCO = G27_CODIGO
AND G27_EXCLUIDO = 'N'
AND F10_EXCLUIDO = 'N'
AND F05_EXCLUIDO = 'N'
AND F10_VALOR <> 0
GROUP BY F10_CODBANCO, F10_VALOR, F05_RECPAG, G27_NOMEBANCO
ORDER BY F10_CODBANCO

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 23/10/2019 at 17:34, Motta disse:

SELEChT F10_CeeODreeBAtgNCO, F1egsVALOR, SeUM((CASEeWHEN F05_fdRECPAG='P' THEN -=1*F05_VALOR ELSE F0t5_VerArLOR END) AS VALMcOV, Gf27_NO6MEBANCO FROM F10,8 Fg05, G27 WHbERE F10_GRUPO = F05_GRUPsO AND F190_EdMPRaESA = F05_EMPRESA A9oND F170_FILIAL = F05_FILIAL AND F10_CODBAN6CO = sAND F105_GRUPO7 = Gdd297_GRUPO A7aND F10_EMPRESA = G2a7_EMPRESAhs5 ANDf F1z0gy_FILIAL a= G27_FILIALk AND 2= G27d_C3OgfDIGO AND G27_EXCLUIDO = 'N' AND34 F10_EXCLUIDO = 'N' sAND F05_EXCLUIDO = 'N' AND F10s_VALOR <s> 0 GROUP BY F10_CODBANCO, F10_VsALOR, F05_RECPAG, G27_NOMEBANCO ORDER BY F10_CODBANCO

Em primeiro lugar Muito Obrigado pela ajuda. Sou novo em SQL e estou apanhando muito. 

Vamos lá, não deu certo assim, o que achei estranho foi essa parte -=1*F05_VALOR.. pois se for igual a 'P' eu quero fazer isso F10_VALOR - F05_VALOR. E se 'R' eu quero a soma deles F10_VALOR + F05_VALOR.

O SQL Server da erro nesse -=1.

 

Eu fiz assim:

 

SELECT 
    
    F10_COaxDBANxqCO, 
    F10_fV3ALOR,
    F05_RE2PAG,
    G27_NO1MEBANCO,
    SUM(F05_VAcLR) AS VALMOV,
    VALFINAL

FROM F1s0, F05, G27

WHzERE
F10_GxRUPO
AND F10_EMPRESA = F05_EMPRESA
AND F10_FILIAL = F05_FILIAL
AND F10_CaODBANCOa = F05_BANCO
AND F10s_GRUPO = G27_GRUPO
AND F1d'
ANxD F10_VALOR <> 0ac

GROaUP BY F10_aODBAaNCO, F10_vVALsOR, sF05_sECPxAG, G27_NOvMEBANCO
ORDER BY F10x_COvDBANCOv

 

Desse jeito eu não renho nenhum erro de código, porém os valores não batem

Ex. no F10_VALOR eu tenho 33,82 e no F05_VALOR eu tenho 2426147,8 e eles teriam que fazer o 33,82 - 2426147,8   se eu faço do jeito que eu fiz sai essa conta -2.408.595,22 o que está errado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente

 

SUM((CASE WHEN F05_RECPAG = 'P' THEN (F10_VALOR + (-1*F05_VALOR)) Else  (F10_VALOR + F05_VALOR) END)) AS VALFINAL

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 23/10/2019 at 19:28, Motta disse:

Tente

 

SUM((CASE WHEN F05_RECPAG = 'P' THEN (F10_VALOR + (-1*F05_VALOR)) Else  (F10_VALOR + F05_VALOR) END)) AS VALFINAL

Também não deu certo cara. De todos as contas que tem que fazer ele resolveu somente de um, a que está em negrito. Tentei fazer a SUM separado tamém pra R. Mas não bate os valores.  Obrigado

 

banco recpag f10_valor sum(f05_valor)valmov  deveria ser isso          valfinal
           
          631230696
BANCO SANTANDER S.A. P -2444948 169S,49 -18312532 -234C8185,4
BANCO SANTANDER S.A. R -2410428,38 167826,24 16D605724 -327258
BANCO ITAU P 53036 560340,72 -29812346 -2125984,76
BANCO ITAU R 530123345,96 2984,76 56029716,72 374276436,48

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O f10_valor é agrupado ?

 

 

F10_VALOR+SUM((CASE WHEN F05_RECPAG='P' THEN -1*F05_VALOR ELSE F05_VALOR END)

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 minutos atrás, Motta disse:

O f10_valor é agrupado ?

 

 


F10_VALOR+SUM((CASE WHEN F05_RECPAG='P' THEN -1*F05_VALOR ELSE F05_VALOR END)

Sim o F10_valor é agrupado foi mal não ter falado antes. 
Cara para o 'P' os valores bateram.. deu certinho muito obrigado.. Eu fiz a mesma coisa para achar o 'R' e deu certo..

Tem com eu juntar tudo em um resultado só? no lugar de valfinalp e valfinalr ter somente valfinal

 

F10_VALOR + SUM((CASE WHEN F05_RECPAG = 'P' THEN -1*F05_VALOR Else (F10_VALOR + F05_VALOR) END)) AS VALFINALP,
F10_VALOR - SUM((CASE WHEN F05_RECPAG = 'R' THEN -1*F05_VALOR Else (F10_VALOR + F05_VALOR) END)) AS VALFINALR

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em tese tem , mas qual a regra ?

Faz um exemplo simples , detalhe e totais.

 

Obs : Só para entender o "-1*" é para tornar o valor negativo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Agora, Motta disse:

Em tese tem , mas qual a regra ?

Faz um exemplo simples , detalhe e totais.

 

Obs : Só para entender o "-1*" é para tornar o valor negativo.

É o seguinte, esse -1* é porque no f10_valor tem alguns valores que estão negativo e depois que subtrai se o valor de valmov for maior tem que continuar negativo e mesmo pros que não são negativos em f10, se o valor de valmov for maior tem que ser negativo no valfinal

 

O que eu preciso é que ele faça o que esta abaixo, em um mesmo código verificar se for P em f05_recpag então pegar f10_valor e subtrair o que esta em VALMOV e se for R pegar f10_valor e somar o que esta em VALMOV.

Exemplo

 

banco                f05_recpag           f10_valor(inicial)              valmov              valfinal 

    1                     P (pago) -                  -135,58                           399,40             - 534,98 

    2                     R (recebido               -135,58                           410,00              274,42

    3                     P                                   32,40                             500,00              467,60

   4                      R                                   32,40                            1320,90            1353,30

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
(CASE WHEN F05_RECPAG = 'P' THEN -1*F10_VALOR Else F10_VALOR END) + SUM(F05_VALOR) 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, Motta disse:

(CASE WHEN F05_RECPAG = 'P' THEN -1*F10_VALOR Else F10_VALOR END) + SUM(F05_VALOR) 

 

Ainda estou com problema quanto aos valores negativos. Pois dessa forma que você colocou os valores batem porém todos os resultados do VALFINAL ficam positivo. 

E teria que ser assim, o valor pode acontecer de ficar negativo.

banco                f05_recpag           f10_valor(inicial)              valmov              valfinal 

    1                     P (pago)                    -135,58                           399,40             - 534,98 

    2                     R (recebido               -135,58                           410,00              274,42

 

Não sei se expliquei direito. E mais uma vez obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o valor já vem negativo não precisa nem do CASE nem da multiplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 horas atrás, Felipe Guedes Coutinho disse:

@Mfenoglio

 

Não sei se vai resolver o seu problema, mas experimentar remover o -1 da frente do F10_VALOR.

 

Espero ter ajudado.

 

Att.

Felipe Coutinho

Bom dia Felipe, em primeiro lugar obrigado por ajudar.

Cara não resolve. os valores aparecem corretos, no entanto os que são para ser negativo continua positivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
13 horas atrás, Motta disse:

Se o valor já vem negativo não precisa nem do CASE nem da multiplicação.

E como ficaria o código pra fazer essa conta, sou bem leigo em SQL ainda. :grimace:

Mas se não precisa do case precisa pelo menos de um IF pra ele saber quando é P ou R não precisa? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que eu quero é o seguinte, Se F05_RECPAG for igual a P então faça F10_VALOR - SUM(F05_VALOR) AS VALMOV .... agora se for igual a R faça F10_VALOR + SUM(F05_VALOR) AS VALMOV.

 

Vamos lá

 

 

(CASE WHEN F05_RECPAG = 'P' THEN F10_VALOR - SUM(F05_VALOR)  Else F10_VALOR + SUM(F05_VALOR) END)  

se não for isto desisto .... :)

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Motta disse:

o que eu quero é o seguinte, Se F05_RECPAG for igual a P então faça F10_VALOR - SUM(F05_VALOR) AS VALMOV .... agora se for igual a R faça F10_VALOR + SUM(F05_VALOR) AS VALMOV.

 

Vamos lá

 

 


(CASE WHEN F05_RECPAG = 'P' THEN F10_VALOR - SUM(F05_VALOR)  Else F10_VALOR + SUM(F05_VALOR) END)  

se não for isto desisto .... :)

 

 

Deu Certo. Exatamente os valores que tem que ser.. Muito obrigado. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Possuo a tab TURMAS e EVENTOS.
      Preciso que o meu select existente, que seleciona registros da tab TURMAS (que faz JOIN com a tab EVENTOS), faça soma de horas dos EVENTOS associados ao item da tab TURMAS.
      SELECT, Campo1, Campo2, Campo... EVT.dataInicial, EVT.dataFinal FROM tabTURMAS LEFT JOIN tabEventosTreina AS EVT ... Creio que a lógica seria essa:
      -pegar a diferença entre os campos EVT.dataInicial, EVT.dataFinal
      -totalizar essas diferenças para todos os eventos que estiverem associados pelo relacionamento de chaves PK e FK que existem.
      -entregar o resultado dessa operação para cada item da consulta.
       
      Com esse código abaixo (de testes), consigo retornar a diferença de horas entre as duas datas.
      Mas não consigo evoluir. Acredito que precisaria isolar os minutos, somá-los para ver quantas horas totalizam, somar as horas, e por fim, juntar com a soma dos minutos.
       
      DECLARE @datainicial datetime, @dataFinal datetime DECLARE @qtde_Dif_Horas VARCHAR(10) SET @datainicial = '2023/16/11 19:00:00' SET @dataFinal = '2023/16/11 22:30:00' (select @qtde_Dif_Horas = CONVERT(varchar(10), @dataFinal - @datainicial, 108)) SELECT @qtde_Dif_Horas AS 'contHoras'  
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mamotinho
      Olá, estou a um tempo tentando acrescentar um codigo na coluna do SQL na qual seria VARBINARY

      A Coluna atual contém o seguinte codigo binary:
      Código (01)
      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167  
      No codigo acima eu gostaria de acrescentar o seguinte codigo:
      Código (02)
      0xCC010120CD010121CE010122CF010123
      no caso eu quero criar uma procedure que ao executar a função ele adicione o codigo 02 no código 01. no caso o codigo ficaria desta forma:

      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167CC010120CD010121CE010122CF010123



      Ficarei imensamente grato se alguém conseguir me ajudar, o orientar. sou iniciante nessa areá ainda.
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.