Ir para conteúdo
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Talvez tirar a " PARTITION BY " .

Compartilhar este post


Link para o post
Compartilhar em outros 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?
   

Compartilhar este post


Link para o post
Compartilhar em outros 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

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta :

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

 

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 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. 
    • Por 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();}
×

Informação importante

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