none
Consulta SQL RRS feed

  • Pregunta

  • Hola, tengo la siguiente consulta: 

    BEGIN
    WITH CTE AS (
        SELECT  ROW_NUMBER() OVER( ORDER BY ps.FECHA) as rn, *
        from cuentas_pagos as ps
        WHERE ps.idCuentaDetalle=23
    )

    (SELECT d.Fecha 'Fecha Orig.', a.Fecha 'Fecha Pago', c.Fecha 'Fecha Ant.',
     IIF(ROW_NUMBER() OVER (ORDER BY a.idCuentadetalle)=1,DATEDIFF(day,d.Fecha, a.Fecha),DATEDIFF(day,c.Fecha, a.Fecha)) 'Dias',
    IIF(ROW_NUMBER() OVER (ORDER BY a.idCuentadetalle)=1,Convert(decimal(10,2), d.Importe *((DATEDIFF(day, d.Fecha,a.Fecha)  * e.InteresDiario) /100)),
    Convert(decimal(10,2), d.Importe *((DATEDIFF(day, c.Fecha,a.Fecha)  * e.InteresDiario) /100)))  'Interes',
    IIF(ROW_NUMBER() OVER (ORDER BY a.idCuentadetalle)=1,d.Importe,'0.00') 'Deuda Inicial', a.Importe 'Pago',
    IIF(ROW_NUMBER() OVER (ORDER BY a.idCuentadetalle)=1,Convert(decimal(10,2),d.Importe+ d.Importe *((DATEDIFF(day, d.Fecha,a.Fecha)  * e.InteresDiario) /100)) -a.Importe ,
                                                         Convert(decimal(10,2), a.Importe *((DATEDIFF(day, c.Fecha,a.Fecha)  * e.InteresDiario) /100))  - a.Importe) 'Saldo',
    ROW_NUMBER() OVER (ORDER BY a.idCuentadetalle) 'Orden'

    FROM CTE a
    LEFT JOIN CTE b ON a.rn = b.rn -1
    LEFT JOIN CTE c ON a.rn = c.rn +1
    INNER JOIN cuentas_detalle d ON d.idCuentaDetalle=a.idCuentaDetalle
    INNER JOIN empresa e ON e.idEmpresa=e.idEmpresa
    )
    END


    y me genera este resultado

    Fecha Orig.    Fecha Pago    Fecha Ant.    Dias    Interes    Deuda Inicial    Pago    Saldo    Orden
    2019-12-01 08:34:00    2020-01-11 18:55:00    NULL    41    328.00    2000.00    610.00    1718.00    1
    2019-12-01 08:34:00    2020-02-13 20:37:00    2020-01-11 18:55:00    33    264.00    0.00    610.00    -529.48    2
    2019-12-01 08:34:00    2020-07-17 11:56:00    2020-02-13 20:37:00    155    1240.00    0.00    200.00    -76.00    3

    Yo necesito recuperar el valor de la columna saldo para la siguiente fila por ej en la segunda fila en saldo que salgo 1718 y asi sucesivamente.... Como puedo hacer?

    Saludos

    viernes, 17 de julio de 2020 15:05

Respuestas

Todas las respuestas

  • Para sacar el saldo de la fila anterior se usa la función LAG:

    select .... LAG(Saldo) OVER (Order by columna) as SaldoAnterior ...

    En el OVER es necesario indicar cuál es la columna que determina el orden (es necesario que exista un orden para que tenga sentido la especificación "la columna saldo para la siguiente fila"; si no hay orden la palabra "siguiente" no significa nada).

    https://docs.microsoft.com/en-us/sql/t-sql/functions/lag-transact-sql?view=sql-server-ver15

    • Marcado como respuesta Mauricio Hamak viernes, 17 de julio de 2020 18:51
    viernes, 17 de julio de 2020 18:11
  • Hola, no puedo usar asignar el saldo a una variable para luego usar LAG?

    Porque la fila saldo es resultado de varios calculos.

    Saludos!

    viernes, 17 de julio de 2020 19:47
  • Sí, lo puedes asignar a una "variable", y de hecho ya sabes cómo se hace porque lo tienes hecho ya en tu sentencia. Se trata de usar una CTE (Common Table Expression). Metes dentro de la CTE la consulta con todos los cálculos, y luego haces un Select desde la CTE y la columna deseada tiene su propio nombre y trae ya el resultado del cálculo, con lo que la puedes usar dos veces (individualmente y en el LAG).

    Por desgracia es un pelín más complicado de lo que parece porque ya tienes una CTE y las CTE no se pueden anidar, sino solo encadenar, y encima la sentencia es bastante compleja, así que te va a costar bastante escribir la segunda CTE. Otra alternativa sería meterlo todo en una Vista y hacer el select sobre la Vista, o meterlo todo en una subconsulta y hacer el select sobre la subconsulta:

    select OtrosCampos, Saldo, Lag(saldo) over (order by Fecha) from (Meter aquí entre paréntesis la consulta que ya tienes) as subconsulta

    viernes, 17 de julio de 2020 20:49