价格变动时获取日期

时间:2017-03-03 00:12:16

标签: sql sql-server sql-server-2012

我试图执行一些DATEDIFF计算,但我只是缺乏完成任务的知识。

我有一张桌子记录了所售物品与操作发生日期和物品的历史价格。因为我住在一个30%通胀率的国家。我必须考虑这个因素来计算每件商品的收入。

一切正常,我保存了购买价格和产品价格变化发生的日期。但是,当该数据未保存为近似值时,我想使用具有不同价格的操作发生的日期。 作为以下选择操作的结果:

USE Rusich
DECLARE 
    @IDNegocio AS INT,
    @UsarIDProducto AS BIT,
    @IDProducto AS VARCHAR(50), 
    @FechaInicio AS DATE, 
    @FechaFinal AS DATE, 
    @TamañoMinimoDeMuestra AS INT, 
    @SeVendeMinimoCadaXDias AS INT,
    @Inflacion AS DECIMAL(18,3),
    @AuxMargen AS DECIMAL(18,2),
    @AuxDifDias AS INT;


SET @FechaInicio = '01/02/10';
SET @FechaFinal = '28/02/18';
SET @IDNegocio = 1;
SET @IDProducto = '6910101404918';                  /*<<<< Cambiar a NULL segun necesidad*/
SET @TamañoMinimoDeMuestra = 1;
SET @SeVendeMinimoCadaXDias = 90;
SET @Inflacion = 0.083;

SELECT 
    AUXFechas.IDProducto,
    AUXFechas.[$ Precio de Venta Historico],
    AUXFechas.[Fecha Precio],
    AUXFechas.[Fecha Venta],
    AUXFechas.FechaAnterior,
    AUXFechas.DiasDiferencia,
    CAST(
        CASE WHEN 
            AUXFechas.IDProducto NOT IN ('112', '113' , '114')
            AND AUXFechas.[Fecha Precio] <= AUXFechas.[Fecha Venta]
            AND StockDetalles.[Precio de Compra] <> 0 
            AND StockDetalles.[Precio de Compra] IS NOT NULL THEN
                (1 - StockDetalles.[Precio de Compra] / AUXFechas.[$ Precio de Venta Historico]) * 100 - (AUXFechas.[$ Descuento]/100) - DATEDIFF(DAY, AUXFechas.[Fecha Precio], AUXFechas.[Fecha Venta]) * @Inflacion
        ELSE
            NULL
        END 
    AS DECIMAL(18,2)) AS [% Margen Ganancia Real]
FROM
    StockDetalles JOIN (
SELECT
        Stock.ID AS IDProducto,
        Stock.Cantidad AS #Disponible,
        Recibos.Cantidad as [#Vendida],
        Recibos.Precio AS [$ Precio de Venta Historico],
        Recibos.Descuento AS [$ Descuento],
        Stock.[Precio de Venta] AS [$ Precio],
        Stock.[Fecha Actualizacion de Precio] AS [Fecha Precio],
        CAST(RecibosRegistros.Fecha AS DATE) AS [Fecha Venta],
        ISNULL(LAG(CAST(RecibosRegistros.Fecha AS DATE), 1) OVER (PARTITION BY Recibos.IDProducto ORDER BY RecibosRegistros.Fecha), Stock.[Fecha Actualizacion de Precio]) AS FechaAnterior,
        /*Considera el caso cuando no existe un registro anterior y usa la fecha de actualizacion de precio si es posible*/
        CASE WHEN (LAG(CAST(RecibosRegistros.Fecha AS DATE), 1) OVER (PARTITION BY Recibos.IDProducto ORDER BY RecibosRegistros.Fecha) IS NULL) AND CAST(RecibosRegistros.Fecha AS DATE) > Stock.[Fecha Actualizacion de Precio] THEN
            (DATEDIFF(DAY, CAST(RecibosRegistros.Fecha AS DATE),
            /*PARTITION BY PARTICIONA POR COLUMNA*/
            ISNULL(LAG(CAST(RecibosRegistros.Fecha AS DATE), 1) OVER (PARTITION BY Recibos.IDProducto ORDER BY RecibosRegistros.Fecha), [Fecha Actualizacion de Precio])) / Recibos.Cantidad) * -1
        ELSE
            (DATEDIFF(DAY, CAST(RecibosRegistros.Fecha AS DATE),
            /*PARTITION BY PARTICIONA POR COLUMNA*/
            LAG(CAST(RecibosRegistros.Fecha AS DATE), 1) OVER (PARTITION BY Recibos.IDProducto ORDER BY RecibosRegistros.Fecha)) / Recibos.Cantidad) * -1
        END AS DiasDiferencia
    FROM 
        RecibosRegistros 
        JOIN Recibos ON RecibosRegistros.IDRecibo = Recibos.IDRecibo 
        JOIN Stock ON Recibos.IDProducto = Stock.ID 
    WHERE 
        RecibosRegistros.NegocioID = @IDNegocio 
        AND Stock.IDNegocio = @IDNegocio 
        AND Stock.ID != '111'
        AND Stock.ID != '112'
        AND Stock.ID != '113'
        AND Stock.ID != '114'
        AND Stock.ID = COALESCE(@IDProducto,Stock.ID)) AS AUXFechas ON StockDetalles.ID = AUXFechas.IDProducto
        JOIN Categorias ON StockDetalles.CategoriaID = Categorias.ID

我获得了这个结果:

IDProducto  $ Precio de Venta Historico Fecha Precio    Fecha Venta FechaAnterior   DiasDiferencia  % Margen Ganancia Real
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6910101404918   15,00           2012-10-18  2012-07-23  2012-10-18  NULL        NULL
6910101404918   15,00           2012-10-18  2012-09-01  2012-07-23  40      NULL
6910101404918   21,00           2012-10-18  2013-07-01  2012-09-01  303     NULL
6910101404918   21,00           2012-10-18  2013-09-02  2013-07-01  63      NULL
6910101404918   21,00           2012-10-18  2013-09-24  2013-09-02  22      NULL
0200002003867   28,00           2014-03-05  2014-07-08  2014-03-05  125     NULL
0200002003867   28,00           2014-03-05  2014-07-08  2014-07-08  0       NULL
0200002003867   28,00           2014-03-05  2014-10-23  2014-07-08  107     NULL
0200002003867   28,00           2014-03-05  2015-01-21  2014-10-23  90      NULL
0200002003867   28,00           2014-03-05  2015-04-06  2015-01-21  75      NULL

我需要做的是获取一个日期列(Fecha Precio),其中[$ Precio de Venta Historico]已更改。

输出应为:

IDProducto      $ Precio de Venta Historico Fecha Precio    Fecha Venta FechaAnterior   DiasDiferencia  % Margen Ganancia Real  Fecha Cambio
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6910101404918   15,00               2012-10-18  2012-07-23  2012-10-18  NULL        NULL            NULL
6910101404918   15,00               2012-10-18  2012-09-01  2012-07-23  40      NULL            2012-10-18
6910101404918   21,00               2012-10-18  2013-07-01  2012-09-01  303     NULL            NULL
6910101404918   21,00               2012-10-18  2013-09-02  2013-07-01  63      NULL            2012-09-01
6910101404918   21,00               2012-10-18  2013-09-24  2013-09-02  22      NULL            2012-09-01
0200002003867   28,00               2014-03-05  2014-07-08  2014-03-05  125     NULL            NULL
0200002003867   28,00               2014-03-05  2014-07-08  2014-07-08  0       NULL            2014-07-08
0200002003867   28,00               2014-03-05  2014-10-23  2014-07-08  107     NULL            2014-07-08
0200002003867   28,00               2014-03-05  2015-01-21  2014-10-23  90      NULL            2014-07-08
0200002003867   28,00               2014-03-05  2015-04-06  2015-01-21  75      NULL            2014-07-08

我的猜测是解决方案必须与LAG / LEAD和PartitionBY IDProducto相关,但我不知道该怎么做。请帮忙

2 个答案:

答案 0 :(得分:0)

添加此代码以尝试获得一些结果,我几乎得到了它但尚未完成:

LAG(AUXFechas.[Fecha Venta], 1, NULL) OVER (PARTITION BY IDProducto, AUXFechas.[$ Precio de Venta Historico] ORDER BY AUXFechas.[Fecha Venta])

GOT:

6910101404918   Bandeja Plastica Borde Dorado Oval 23   Bazar   0   1   15,00   21,00   2012-10-18  2012-07-23  2012-10-18  NULL    NULL    NULL
6910101404918   Bandeja Plastica Borde Dorado Oval 23   Bazar   0   1   15,00   21,00   2012-10-18  2012-09-01  2012-07-23  40  NULL    2012-07-23
6910101404918   Bandeja Plastica Borde Dorado Oval 23   Bazar   0   1   21,00   21,00   2012-10-18  2013-07-01  2012-09-01  303 NULL    NULL
6910101404918   Bandeja Plastica Borde Dorado Oval 23   Bazar   0   1   21,00   21,00   2012-10-18  2013-09-02  2013-07-01  63  NULL    2013-07-01
6910101404918   Bandeja Plastica Borde Dorado Oval 23   Bazar   0   1   21,00   21,00   2012-10-18  2013-09-24  2013-09-02  22  NULL    2013-09-02

最后日期(2013-09-02)应与之前的日期(2013-07-01)相同

尝试使用其他产品并获得:

0200002003867   Bandeja Acero Oval 21cm Bazar   0   1   28,00   28,00   2014-03-05  2014-07-08  2014-03-05  125 NULL    NULL
0200002003867   Bandeja Acero Oval 21cm Bazar   0   1   28,00   28,00   2014-03-05  2014-07-08  2014-07-08  0   NULL    2014-07-08
0200002003867   Bandeja Acero Oval 21cm Bazar   0   1   28,00   28,00   2014-03-05  2014-10-23  2014-07-08  107 NULL    2014-07-08
0200002003867   Bandeja Acero Oval 21cm Bazar   0   1   28,00   28,00   2014-03-05  2015-01-21  2014-10-23  90  NULL    2014-10-23
0200002003867   Bandeja Acero Oval 21cm Bazar   0   1   28,00   28,00   2014-03-05  2015-04-06  2015-01-21  75  NULL    2015-01-21

只有右列中NULL之后的第一个单元格才可以,但其余单元格应该是相同的

答案 1 :(得分:0)

最后通过使用FIRST_VALUE函数得到了我想要的东西:

FIRST_VALUE(AUXFechas.[Fecha Venta]) OVER (PARTITION BY AUXFechas.IDProducto, AUXFechas. [$ Precio de Venta Historico] ORDER BY  AUXFechas.[Fecha Venta])

和GOT THIS!:

IDProducto  Fecha Precio    Fecha Venta FechaAnterior   DiasDiferencia  (Sin nombre de columna)
7790002000483   2014-08-28  2012-04-14  2014-08-28  NULL    2012-04-14
7790002000483   2014-08-28  2012-05-03  2012-04-14  19  2012-04-14
7790002000483   2014-08-28  2012-05-03  2012-05-03  0   2012-04-14
7790002000483   2014-08-28  2012-06-02  2012-05-03  30  2012-04-14
7790002000483   2014-08-28  2012-06-02  2012-06-02  0   2012-04-14
7790002000483   2014-08-28  2012-06-02  2012-06-02  0   2012-04-14
7790002000483   2014-08-28  2012-06-18  2012-06-02  16  2012-04-14
7790002000483   2014-08-28  2012-07-05  2012-06-18  17  2012-04-14
7790002000483   2014-08-28  2012-07-14  2012-07-05  4   2012-04-14
7790002000483   2014-08-28  2012-07-20  2012-07-14  6   2012-04-14
7790002000483   2014-08-28  2012-07-23  2012-07-20  3   2012-04-14
7790002000483   2014-08-28  2012-07-23  2012-07-23  0   2012-04-14
7790002000483   2014-08-28  2013-01-30  2012-07-23  191 2013-01-30
7790002000483   2014-08-28  2013-07-20  2013-01-30  171 2013-01-30
7790002000483   2014-08-28  2013-10-16  2013-07-20  88  2013-01-30
7790002000483   2014-08-28  2015-07-14  2013-10-16  636 2015-07-14