私はいくつかの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・デ・ベンタヒストリカル] かわった。
出力は次のようになります。
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に関連しなければならないということですが、私はそれを行う方法を知りません。いくつかの結果を取得しようとする
30%のインフレを説明する - これは独自のビジネスルールです!私が正しく理解していれば、現在の出力と必要な出力は掲載されていますが、入力は表示されません - そうですか?それは入力を投稿するのに役立つかもしれません。また、不要な列をサンプルデータセットから簡単に削除することもできます。 SQL 2008には先行/遅れがありませんので、これが達成される方法は、最新の有効なトランザクションを決定し、それに参加して、それを使用することです。 –