如何进行运行总计/计算?

时间:2014-11-11 23:38:52

标签: sql sql-server sql-server-2008-r2

我发现自己陷入了一个我无法弄清楚的具有挑战性的场景。我有一个表“#PriceChange”,我需要根据价格变化找出两个日期之间的各种利润损失

示例:

产品1001(黑色牛仔裤),改变价格3次。

  • 2014-11-02:10.99> 8.99(已售出50件)
  • 2014-11-03:8.99> 4.99(已售出25件)

我需要根据原价计算损失。

遵循:

  • (10.99 - 8.99)= $ 2,$ 2 x 50 = $ 100亏本
  • (8.99 - 4.99)= $ 4,$ 4 x 25 = $ 100损失。

总损失= 200美元。

非常感谢任何帮助。

CREATE TABLE #PriceChange
(
Product int,
Description varchar(30),
ValidFrom date,
ValidTo date,
CurrentPrice decimal (5,2),
SoldBetweenValidDates int
);

INSERT INTO #PriceChange VALUES (1001,'Black Jeans','2014-11-01','2014-11-01', 10.99, 100);
INSERT INTO #PriceChange VALUES (1001,'Black Jeans','2014-11-02','2014-11-02', 8.99, 50);
INSERT INTO #PriceChange VALUES (1001,'Black Jeans','2014-11-03',NULL, 4.99, 25);
INSERT INTO #PriceChange VALUES (1002,'Shirt','2014-11-01','2014-11-01', 10.99, 100);
INSERT INTO #PriceChange VALUES (1002,'Shirt','2014-11-02','2014-11-02', 8.99, 50);
INSERT INTO #PriceChange VALUES (1002,'Shirt','2014-11-03',NULL, 4.99, 25);

SELECT  *
FROM    #PriceChange

DROP TABLE #PriceChange

3 个答案:

答案 0 :(得分:0)

希望这会有所帮助:

WITH cte AS (
      SELECT  
         p1.Product
         , OverallDiff
      FROM    
         #PriceChange p1
      CROSS APPLY
      (
         SELECT 
            MIN(p2.ValidFrom) as ValidP2
         FROM
            #PriceChange p2
         WHERE
            p1.Product = p2.Product
         AND p1.ValidTo < ISNULL(p2.ValidFrom,'9999-12-31')
       ) as p2
       CROSS APPLY
       (
          SELECT 
            (p1.CurrentPrice-p3.CurrentPrice) * (p1.SoldBetweenValidDates - p3.SoldBetweenValidDates) AS OverallDiff
          FROM
             #PriceChange p3
          WHERE
             p1.Product = p3.Product
          AND p2.ValidP2 = p3.ValidFrom
       ) AS p3
     )
     SELECT
         Product 
         , SUM(OverallDiff) AS OverallDiff
     FROM
         cte
     GROUP BY
         Product

答案 1 :(得分:0)

以下是一种使用CROSS APPLY的方法,该方法查找并使用上一期间的价格和数量来计算损失。

SELECT pc.Product, SUM(loss.TotalLoss) as TotalLoss
FROM    #PriceChange pc
CROSS APPLY (
    SELECT TOP 1 (pc_prev.CurrentPrice - pc.CurrentPrice) *
        pc.SoldBetweenValidDates as TotalLoss
    FROM #PriceChange pc_prev
    WHERE pc_prev.Product = pc.Product AND pc_prev.ValidTo < pc.ValidFrom
    ORDER BY pc_prev.Product, pc_prev.ValidTo DESC
) loss
GROUP BY pc.Product

Product     TotalLoss
----------- ---------------------------------------
1001        200.00
1002        200.00

答案 2 :(得分:0)

with cteprice as
(   select *, 
    row_number() over(partition by product order by validfrom) as rnk 
    from #PriceChange)

select  p1.Product, 
        sum((p1.CurrentPrice - p2.CurrentPrice)* p2.SoldBetweenValidDates) 
from cteprice p1
join cteprice p2 on p1.rnk + 1 = p2.rnk and p1.Product = p2.Product
group by p1.Product