Jump to content
marcos.dmasceno

Somar valores da linha anterior com a próxima.

Recommended Posts

Gostaria de saber se existe uma forma de somar os valor de uma linha com a sua anterior.

Ex: No select abaixo, o resultado que estou obtendo não está fazendo o acumulado

 

SELECT DATMOV, VLRMOV, DEBCRE,
(CASE WHEN E600MCC.DEBCRE = 'C' THEN (VLRMOV) ELSE (VLRMOV * -1) END) AS RESULT 
FROM E600MCC
GROUP BY  DATMOV, VLRMOV, DEBCRE, E600MCC.SEQMOV, E600MCC.DEBCRE
ORDER BY  DATMOV ASC

 

DatMov                                      VlrMov     DebCre    Acumulado

20 13-11-01 00:00:00.000        15               C              15
2013-11-01 00:00:00.000         10               C              10
2013-11-01 00:00:00.000          -5               D              -5
2013-11-01 00:00:00.000         12               C              12
2013-11-04 00:00:00.000        -20               D             -20
2013-11-04 00:00:00.000         50               C              50

 

Eu queria que a coluna acumulado fosse sempre a soma do valor atual com a anterior. Isso é possível?

Muito obrigado.

Share this post


Link to post
Share on other sites

Publica a sql e o resultado , o que é "fracionada" ?

 

Talvez tirar a " PARTITION BY " .

Share this post


Link to post
Share on other sites

Motta, a select está desse jeito usando o over.

 

SELECT DATMOV, VLRMOV, DEBCRE  
    ,SUM(VLRMOV) OVER(PARTITION BY DEBCRE) AS Total  
FROM E600MCC
ORDER BY  DATMOV ASC

 

E o resultado está vindo assim. Ele está somando todos os VlrMov que os DebCre são 'C'.

DatMov                                   VlrMov     DebCre

2013-11-01 00:00:00.000    1428.99       C              3099384862.53
2013-11-01 00:00:00.000    1536.90       C              3099384862.53
2013-11-01 00:00:00.000    15300.00     C              3099384862.53
2013-11-01 00:00:00.000    918.00          C              3099384862.53
2013-11-04 00:00:00.000    1890.00        C              3099384862.53
2013-11-04 00:00:00.000    114712.50   C              3099384862.53
2013-11-04 00:00:00.000    1190.00       C              3099384862.53
2013-11-04 00:00:00.000    7938.20       C             3099384862.53

....

 

No meu select original, eu acho que não expliquei o meu problema. Eu fiz uma coluna "Result" para negativar o valor quando o "DebCre" for igual a "D". Neste caso, o que eu preciso é de uma nova coluna que acumule os valores linha a linha.

 

SELECT DATMOV, VLRMOV, DEBCRE,
(CASE WHEN E600MCC.DEBCRE = 'C' THEN (VLRMOV) ELSE (VLRMOV * -1) END) AS RESULT 
FROM E600MCC
ORDER BY  DATMOV ASC

                                                                                                                                      Acumulado

DatMov                                        VlrMov         DebCre     Result                  (Coluna Hipotética - Não existe)

2013-11-01 00:00:00.000      15300.00           C            15300.00                        15300.00
2013-11-01 00:00:00.000      918.00               C             918.00                            16218.00
2013-11-01 00:00:00.000      1536.90             D            -1536.90                         14681.1
2013-11-01 00:00:00.000      1428.99             C            1428.99                          16110.09
2013-11-04 00:00:00.000      7938.20             D            -7938.20                            ......
2013-11-04 00:00:00.000      175051.18         D            -175051.18
2013-11-04 00:00:00.000      1190.00             C             1190.00

 

Existe uma forma de criar essa coluna acumulando o valor da coluna atual com a anterior?
   

Share this post


Link to post
Share on other sites

Motta, fiz de outra forma. Ele fez o acumulado por dia, e não por linha.

 

SELECT DATMOV, VLRMOV, DEBCRE, SEQMOV  
   ,(CASE WHEN E600MCC.DEBCRE = 'C' THEN (VLRMOV) ELSE (VLRMOV * -1) END) AS Valor_Movimento    
   ,CONVERT(varchar(20),AVG(VLRMOV) OVER (PARTITION BY DATMOV   
                                            ORDER BY DATEPART(DD,DATMOV)   
                                           ),1) AS Media_Movimento  
   ,CONVERT(varchar(20),SUM(VLRMOV) OVER (PARTITION BY DATMOV   
                                            ORDER BY DATEPART(DD,DATMOV)   
                                            ),1) AS Acumulado  
FROM E600MCC  
WHERE DEBCRE IS NOT NULL  
ORDER BY DATMOV asc, SEQMOV;  

DatMov                                   VlrMov             DebCre     Seq    Valor_Movim.       Media                   Acumulado

2013-11-01 00:00:00.000    15300.00             C              1      15300.00            4795.972500        19183.89
2013-11-01 00:00:00.000    918.00                  C              1      918.00                4795.972500        19183.89
2013-11-01 00:00:00.000    1428.99               C               1      1428.99             4795.972500        19183.89
2013-11-01 00:00:00.000    1536.90               C               2      1536.90             4795.972500        19183.89
2013-11-04 00:00:00.000    114712.50          C               1      114712.50         70146.896666      420881.38
2013-11-04 00:00:00.000    1190.00              C               1       1190.00             70146.896666      420881.38
2013-11-04 00:00:00.000    7938.20              C               2       7938.20             70146.896666      420881.38
2013-11-04 00:00:00.000    175051.18         C                2       175051.18        70146.896666      420881.38
2013-11-04 00:00:00.000    120099.50         C                3       120099.50        70146.896666      420881.38
2013-11-04 00:00:00.000    1890.00             C                3      1890.00              70146.896666      420881.38

 

 

 

Share this post


Link to post
Share on other sites

Tenta :

 ,CONVERT(varchar(20),AVG(VLRMOV) OVER ()   
                                           ),1) AS Media_Movimento  
   ,CONVERT(varchar(20),SUM(VLRMOV) OVER ()   
                                            ),1) AS Acumulado

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By PeeWee
      Preciso somar os valores que estáo na tabela tempo_servico, para utiliza-la posteriormente em uma validação de um determinado campo, estou fazendo da seguinte forma:
      $tempoDoServico = mysqli_query($conn, "SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(tempo_servico))) FROM agendamento WHERE dia = '$diaAgendado' "); $tempoDoServico2 = mysqli_fetch_row($tempoDoServico);                      $time2= $tempoDoServico2[0];  $parts2=explode(':',$time2);  $seconds2 = ($parts2[0]*60) + $parts2[1];  $total2 = $seconds2 * 1;    //este numero 1 serve para outra coisa que no momento não nos interessa. O que ocorre é, quando há algum valor registrado na tabela, o código funciona normalmente, mas se não há nenhum valor ele exibe um erro (Notice: Undefined offset: 1 in ) isto em relação a variavel $parts2[1]. Só que sempre vai ocorrer desse registro estar vazio na primeira vez, após o primeiro usuario cadastrar sua consulta ele não exibirá mais erros. Não sei exatamente o que fazer, pois nao estou conseguindo entender, se está vazio ele simplesmente não deveria fazer nada e nao ficar exibindo erro. Espero que alguém mais experiente com PHP possa me ajudar. 
    • By Retur
      Já dei uma pesquisada e não estou encontrando solução para o problema abaixo,gostaria de somar os valores do $valor_total_compra['real'],como posso estar fazendo isso?
       

      $valor_compra = $conn->prepare("SELECT * FROM campo");$valor_compra->execute();while ($valo_compra = $valor_compra->fetch(PDO::FETCH_ASSOC)){ $query = $conn->prepare("SELECT * FROM campo_1 WHERE id = '".$valo_compra['cadeira']."'");$query->execute();$valor_total_compra = $query->fetch();}
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.