2017-03-03 2 views
0

私はいくつかの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に関連しなければならないということですが、私はそれを行う方法を知りません。いくつかの結果を取得しようとする

+1

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

答えて

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年9月2日)他の製品としようと試みた前回(2013年7月1日)

と同じでなければなりませんし、得た:

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の後の最初のセルはOKですが、残りは同じ

0

は最終的に私はFIRST_VALUE関数を使用して望んだことsould:

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

、これは

を!: GOT
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 
関連する問題