在范围表上计算成本

时间:2013-10-19 21:24:32

标签: mysql sql tsql

我有两张类似下面的表:

ItemTable
-----------------------------
ItemId | NumberPurchased
1      | 10
2      | 90

我需要根据下表确定订单的总成本,该表根据订购数量保持每件商品的价格滑动比例:

PriceBands
-----------------------------
ScaleId | LowerLimit | UpperLimit | CostPerItem
1       | 1          | 5          | 10
2       | 6          | 10         | 9
3       | 11         | 20         | 8
...

我需要以某种方式计算总成本并将其加入第一个表(项目)。

有人可以帮忙吗?

为了清楚ItemId 1,计算方法如下:

NumberPurchased = 10
(5 * 10) + (5 * 9)  = 95

绑扎带仅对超过上限的物品产生影响。

3 个答案:

答案 0 :(得分:4)

如果你对每件商品都有相同的价格,那么这样的话就可以了:

SELECT i.itemID, i.NumberPurchased, i.NumberPurchased * p.costPerItem as "Cost"
FROM itemTable i, PriceBands p
WHERE i.NumberPurchased >= p.LowerLimit 
      AND i.NumberPurchased <= p.UpperLimit;

sqlfiddle demo

如果您想要物品的不同价格,您必须将itemId放入priceBands并加入该itemId上的两个表。


要处理每个购买数量级别的增量成本,您可以执行以下操作:

SELECT i.itemID, i.NumberPurchased, SUM((
      CASE 
        WHEN i.NumberPurchased > p.upperLimit
          THEN p.upperLimit
        ELSE i.NumberPurchased - p.LowerLimit + 1
        END
      ) * p.costPerItem) AS "Cost"
FROM itemTable i, PriceBands p
WHERE i.NumberPurchased > p.LowerLimit
GROUP BY 1, 2

这将通过PriceBands表中的每一行i.NumberPurchased > p.LowerLimit,同时执行以下操作:

  • p.costPerItemp.upperLimit相乘i.NumberPurchased > p.upperLimit。 (5 * 10);
  • p.costPerItem乘以i.NumberPurchased - p.lowerLimit + 1. (9 * 10-6 + 1 . This + 1 is to include the lowerLimit`数字也。)

sqlfiddle demo

答案 1 :(得分:1)

如果PriceBands表中有外键,则查询将返回您询问的内容:

select it.itemId, pb.costPerItem
from ItemTable it, 
     PriceBands pb
where it.itemId = pb.itemId
and it.numberPurchased >= pb.LowerLimit
and it.numberPurchased <= pb.upperLimit;

答案 2 :(得分:1)

假设这些范围不重叠,我将使用基于TOP(1)过滤器的以下解决方案(这样,SQL Server“确切地知道”对于每个项目,[最大]只有一行要查找PriceBands表;注意:我没有测试过这个解决方案):

SELECT  i.ItemID, i.NumberPurchased, i.NumberPurchased * oa.CostPerItem as ItemCost
FROM    ItemTable i 
OUTER APPLY
(
    SELECT  TOP(1) p.CostPerItem
    FROM    PriceBands p
    WHERE   i.NumberPurchased >= p.LowerLimit 
    AND     i.NumberPurchased <= p.UpperLimit
) oa