none
Calcular Variacion entre dos Fechas de una misma tabla RRS feed

  • Pregunta

  • Buenos días comunidad!

    Hoy les traigo una consulta si alguien me puede ayudar a realizar algo que de seguro es re sencillo pero no encuentro la forma de hacerlo...

    Necesitaría calcular la variación de la facturación que se hizo el día anterior de mi empresa vs el mismo día del mes anterior. Ya que estoy haciendo un panel de control en power bi y no encuentro la forma de generar la visualización para hacerlo (usualmente al ver las consultas en sql puedo hacerlas).

    Las consultas son muy sencillas y solo engloban 1 sola tabla.

    select sum(subtotal+seguro+recargo-descuento) as TotalRECP -- FacturacionAyer
    From Envios 
    where TipoComprobante in ('RE', 'CP') 
    and FechaRecepcion = Getdate()-1 and Anulado = 0
    
    select sum(subtotal+seguro+recargo-descuento) as TotalRECP -- FacturacionMesAnterior 
    From Envios 
    where TipoComprobante in ('RE', 'CP') 
    and FechaRecepcion = "20190722" and Anulado = 0

    Lo que yo necesitaría sería como "unir" ambas dos consultas para que en 1 columna tenga lo hecho ayer, en otra lo hecho el día de ayer pero del mes pasado en otra la variación en numero y por ultimo una columna en porcentaje...

    Una ejemplo de como debería de ser...

    Fecha                    FacturacionAyer        FacturacionAyerMesPasado  VariacionNro  %Variacion       

    2019-08-22                  1500                               1000                    +500             +50%

    No hace falta colocar los signos en ambos casos ya que eso luego le aplico formato condicional en power bi

    Algo así estoy buscando lograr...

    El modelo de la tabla sería:

    Envios

    FechaRecepcion Date

    Subtotal Decimal

    Seguro Decimal

    Recargo Decimal

    Descuento Decimal

    TipoComprobante varchar(2)

    Anulado Boolean

    Como podría hacerlo por favor alguien me podría ayudar¡¡

    Muchas Gracias de ante mano!




    • Editado Mariano D viernes, 23 de agosto de 2019 14:18
    viernes, 23 de agosto de 2019 14:13

Respuestas

  • Hola Mariano D:

    Puedes realizar un pivot simple.

    CREATE TABLE envios
    (tipoComprobante VARCHAR(2), 
     FechaRecepcion  DATE, 
     Anulado         BIT, 
     subtotal        DECIMAL(10,2), 
     seguro          DECIMAL(10,2), 
     recargo         DECIMAL(10,2), 
     descuento       DECIMAL(10,2)
    );
    GO
    INSERT INTO envios 
    (tipoComprobante , 
     FechaRecepcion  ,
     Anulado         ,
     subtotal        ,
     seguro          ,
     recargo         ,
     descuento       
    )
    VALUES
    ('RE', '20190823', 0, 15, 12.3, 2.1, 1.2),
    ('RE', '20190823', 0, 25, 21.3, 2.1, 1.2),
    ('RE', '20190823', 0, 35, 33  , 2.1, 1.2),
    ('RE', '20190723', 0, 15, 12.3, 2.1, 1.2),
    ('RE', '20190723', 0, 15, 12.3, 2.1, 1.2);
    GO

    Como observarás en el escenario he cambiado el tipo de dato boolean por bit, ya que en SQL server no existe boolean

    Tipos de datos

    https://docs.microsoft.com/es-es/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-2017

    Solución pivot

    SELECT CAST(GETDATE() - 1 AS DATE)  AS [FECHA], 
           PVT.[FACTURACIONAYER] AS FacturacionAyer, 
           PVT.[FACTURACIONMESANTERIOR] AS FacturacionAyerMesPasado, 
           PVT.[FACTURACIONAYER] - PVT.[FACTURACIONMESANTERIOR] AS VariacionNro, 
           CAST (PVT.[FACTURACIONMESANTERIOR] * 100 / PVT.[FACTURACIONAYER] AS INT) AS [%Variacion]
    FROM
    (
        SELECT SUM(subtotal + seguro + recargo - descuento) AS TotalRECP, 
               'FacturacionAyer' AS [Rango]
        FROM Envios
        WHERE TipoComprobante IN('RE', 'CP')
        AND FechaRecepcion = CAST(GETDATE() - 1 AS DATE)
        AND Anulado = 0
        UNION ALL
        SELECT SUM(subtotal + seguro + recargo - descuento) AS TotalRECP, 
               'FacturacionMesAnterior'
        FROM Envios
        WHERE TipoComprobante IN('RE', 'CP')
        AND FechaRecepcion = CAST('20190723' AS DATE)
        AND Anulado = 0
    ) AS source PIVOT(MAX(TOTALRECP) FOR RANGO IN([FacturacionAyer], 
                                                  [FacturacionMesAnterior])) AS pvt;

    Salida

    Pivot

    https://javifer2.blogspot.com/search/label/pivot

    Espero te ayude

    • Marcado como respuesta Mariano D lunes, 26 de agosto de 2019 12:36
    sábado, 24 de agosto de 2019 6:32

Todas las respuestas

  • Hola   Mariano D

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te comparto a continuación el siguiente enlace

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

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 23 de agosto de 2019 15:32
    Moderador
  • Hola Pablo si leí de Microsoft como calcular la varianza mi problema es que no se como realizar la comparativa...

    Osea de Dia Anterior vs Dia Anterior del Mes pasado eso es lo que no sabría bien calcular...

    Como lo puedo hacer?

    viernes, 23 de agosto de 2019 17:20
  • Hola Mariano D:

    Puedes realizar un pivot simple.

    CREATE TABLE envios
    (tipoComprobante VARCHAR(2), 
     FechaRecepcion  DATE, 
     Anulado         BIT, 
     subtotal        DECIMAL(10,2), 
     seguro          DECIMAL(10,2), 
     recargo         DECIMAL(10,2), 
     descuento       DECIMAL(10,2)
    );
    GO
    INSERT INTO envios 
    (tipoComprobante , 
     FechaRecepcion  ,
     Anulado         ,
     subtotal        ,
     seguro          ,
     recargo         ,
     descuento       
    )
    VALUES
    ('RE', '20190823', 0, 15, 12.3, 2.1, 1.2),
    ('RE', '20190823', 0, 25, 21.3, 2.1, 1.2),
    ('RE', '20190823', 0, 35, 33  , 2.1, 1.2),
    ('RE', '20190723', 0, 15, 12.3, 2.1, 1.2),
    ('RE', '20190723', 0, 15, 12.3, 2.1, 1.2);
    GO

    Como observarás en el escenario he cambiado el tipo de dato boolean por bit, ya que en SQL server no existe boolean

    Tipos de datos

    https://docs.microsoft.com/es-es/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-2017

    Solución pivot

    SELECT CAST(GETDATE() - 1 AS DATE)  AS [FECHA], 
           PVT.[FACTURACIONAYER] AS FacturacionAyer, 
           PVT.[FACTURACIONMESANTERIOR] AS FacturacionAyerMesPasado, 
           PVT.[FACTURACIONAYER] - PVT.[FACTURACIONMESANTERIOR] AS VariacionNro, 
           CAST (PVT.[FACTURACIONMESANTERIOR] * 100 / PVT.[FACTURACIONAYER] AS INT) AS [%Variacion]
    FROM
    (
        SELECT SUM(subtotal + seguro + recargo - descuento) AS TotalRECP, 
               'FacturacionAyer' AS [Rango]
        FROM Envios
        WHERE TipoComprobante IN('RE', 'CP')
        AND FechaRecepcion = CAST(GETDATE() - 1 AS DATE)
        AND Anulado = 0
        UNION ALL
        SELECT SUM(subtotal + seguro + recargo - descuento) AS TotalRECP, 
               'FacturacionMesAnterior'
        FROM Envios
        WHERE TipoComprobante IN('RE', 'CP')
        AND FechaRecepcion = CAST('20190723' AS DATE)
        AND Anulado = 0
    ) AS source PIVOT(MAX(TOTALRECP) FOR RANGO IN([FacturacionAyer], 
                                                  [FacturacionMesAnterior])) AS pvt;

    Salida

    Pivot

    https://javifer2.blogspot.com/search/label/pivot

    Espero te ayude

    • Marcado como respuesta Mariano D lunes, 26 de agosto de 2019 12:36
    sábado, 24 de agosto de 2019 6:32
  • Necesitaría calcular la variación de la facturación que se hizo el día anterior de mi empresa vs el mismo día del mes anterior.

    Además de la sugerencia de Javier, he aquí otro enfoque al mismo problema:

    -- código #1
    declare @Ayer date, @MesAnterior date;
    set @Ayer= dateadd (day, -1, cast (current_timestamp as date));
    set @MesAnterior= dateadd (month, -1, @Ayer);
    
    --
    with 
    Facturacion as (
    SELECT FechaRecepcion, sum (coalesce (subtotal, 0) + coalesce (seguro, 0) + 
                coalesce (recargo, 0) - coalesce (descuento, 0)) as TotalRECP 
      from Envios 
      where TipoComprobante in ('RE', 'CP') 
            and Anulado = 0
            and FechaRecepcion in (@Ayer, @MesAnterior)
      group by FechaRecepcion
    )
    SELECT T1.FechaRecepcion as Fecha, 
    coalesce (T1.TotalRECP, 0) as FacturacionAyer, T2.FechaRecepcion as [Mes Pasado],
    coalesce (T2.TotalRECP, 0) as FacturacionAyerMesPasado, (coalesce (T1.TotalRECP, 0) - coalesce (T2.TotalRECP, 0)) as VariacionNro, (1.0 * (coalesce (T1.TotalRECP, 0) - coalesce (T2.TotalRECP, 0)) / nullif (T2.TotalRECP, 0)) as PercVariacion from FacturacionAyer as T1 cross join FacturacionAyer as T2 where T1.FechaRecepcion = @Ayer and T2.FechaRecepcion = @MesAnterior;

    ---

    La comparación del volumen de negocios en día actual del mes con el día respectivo del mes anterior ni siempre produce resultados porque el día del mes anterior puede haber ocurrido en un fin de semana o un día festivo. Por ejemplo, 28/8/2019 es miércoles pero 28/7/2019 fue el domingo.

    Lo que generalmente se hace es comparar volúmenes de negocios en períodos semanales o de 30 días. Por ejemplo, compararía el volumen de negocios mensual en el período del 29/7/2019 al 28/8/2019 con el volumen de negocios mensual en el período del 29/6/2019 al 28/7/2019.

     

    Si esta respuesta te ayudó a resolver tu problema, recuerda marcarla.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.
    • Editado José Diz sábado, 24 de agosto de 2019 19:30
    sábado, 24 de agosto de 2019 11:25
  • Buenos días Javier....

    Hice un par de modificaciones a tu query ya que tenias mas generada la formula para el calculo de la variación porcentual (según lo que busqué en internet) pero me sirvió un montón tu explicación y me quedó perfecto. Muchas Gracias.

    lunes, 26 de agosto de 2019 12:38
  • Hola José emplee conjuntamente con la query de Javier los datos de seteo de fechas para poder calcular automáticamente las fechas.

    Muchas Gracias por la información brindada voy a ver cómo lo puedo resolver ahora en Power BI.

    lunes, 26 de agosto de 2019 12:40
  • Un placer, que te hubiese ayudado
    lunes, 26 de agosto de 2019 14:52