none
While en sql comparando 2 fechas RRS feed

  • Pregunta

  • Me podrían ayudar como puedo recorrer una tabla con un while.

    Tengo la siguiente tabla, quiero recorrer la OP Op-07550 con la oportunidad Op-07550, aunque sean de distintas fechas.

    Es decir, quiero comparar los montos de las OPs que sean iguales,

    Por ejemplo en el primer caso sería Op=Op-07550 monto 1891.36, fecha=09/07/2018 con la fila 8 para que me quede una direrencia(1891.36-558.67)=1332.69, es decir verde con verde, amarillo con amarillo

    lunes, 9 de julio de 2018 22:15

Todas las respuestas

  • Un WHILE sería la forma que usaría un programador en términos generales.  Pero en SQL Server buscamos hacerlo todo como un conjunto, no como registros individuales.

    Si lo que necesita es calcular la diferencia en montro entre el registro N y el N-1 (basándose en OP), puede hacerse todo de una sola vez.

    With rankedOps As
    (
        Select
            OP
            , Monto
            , Fecha
            , Row_Number() Over (Partition By OP Order By Fecha Asc) As [rid]
        From
            algunaTabla
    )
    Select
        ro.OP
        , ro.Fecha As [FechaFinal]
        , roAnt.Fecha As [FechaInicial]
        , ro.Monto - roAnt.Monto As [DiferenciaMonto]
    From
        rankedOps As ro
        Inner Join
        rankedOps As roAnt
        On ro.rid = roAnt.rid + 1 And ro.OP = roAnt.OP
    ;

    No lo probé, pero espero le funcione bien.  Y antes de que venga Hunchback, existen las funciones LEAP y LAG en SQL Server 2012 y superior que hacen este tipo de cosa más fácilmente, pero no he tenido tiempo de estudiar esto. :-(


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT



    • Editado webJose martes, 10 de julio de 2018 3:10
    martes, 10 de julio de 2018 3:08
  • Como te dice webjose con las funciones de windowing puedes resolver esto de forma más o menos sencilla.

    hace falta un orden que yo he supueto por fecha unque no puede ser porque no la tienes rellena. si es por un identificador o por cualquier otra cosa podrás adaptar el query.

    declare @t table (opc char(10),monto money,fecha datetime)
    insert into @t values ('op-07550',1891.36,'20180709'),('op-07551',1891.36,'20180709'),('op-07552',1891.36,'20180709'),
    				  ('op-07553',85,'20180709'),('op-07554',85,'20180709'),('op-07555',85,'20180709'),
    				  ('op-07550',558.67,'20180710'),('op-07551',558.67,'20180710'),('op-07552',558.67,'20180710')
    select *, lead(monto) over(partition by opc order by fecha),monto-coalesce(lead(monto) over (partition by opc order by fecha),0) from @t


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 10 de julio de 2018 6:41
    Moderador