我发现自己陷入了一个我无法弄清楚的具有挑战性的场景。我有一个表“#PriceChange”,我需要根据价格变化找出两个日期之间的各种利润损失
示例:
产品1001(黑色牛仔裤),改变价格3次。
我需要根据原价计算损失。
遵循:
总损失= 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
答案 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