我试图执行一些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相关,但我不知道该怎么做。请帮忙
答案 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