首页 > 解决方案 > SQL根据特定条件计算供应商折扣

问题描述

我有一个折扣表,其中列出了有资格获得折扣的供应商和折扣百分比。此折扣也基于项目类别。我想列出所有供应商、他们提供的物品以及每个物品(如果它们属于该类别)的适用折扣。还有一种特殊情况,如果折扣表中缺少类别,则供应商有资格获得他们销售的所有商品的折扣。在我下面的示例中,供应商 4 和 5 有资格获得他们销售的所有商品的折扣

这是我在 MySQL 中尝试的代码,但这适用于不符合折扣条件的商品 -

SELECT asl.supplier_id,i.item_id, i.cat,d.discount
from all_supplier asl left outer join discount d on asl.supplier_id = d.supplier_id
left outer join supplier_item si on d.supplier_id = si.supplier_id
left outer join item i on si.item_id = i.item_id;

这是我得到的实际结果,请注意供应商 1 和项目 3,应该没有折扣。也有供应商提供的物品未在折扣中列出。此列表中缺少供应商 6,7 提供的物品

在此处输入图像描述

样本数据集

all_supplier all_supplier 折扣 折扣 商品 物品 供应商 _商品供应商_项目

标签: sqljoinmany-to-many

解决方案


尝试为折扣表利用更复杂的连接条件。这个应该工作:

SELECT
    s.supplier_id,
    i.item_id,
    i.cat,
    d.discount
FROM all_supplier s
LEFT JOIN supplier_item si
    ON si.supplier_id = s.supplier_id 
LEFT JOIN item i
    ON i.item_id = si.item_id
LEFT JOIN discount d
    ON d.supplier_id = s.supplier_id 
    AND (d.cat = i.cat OR d.cat IS NULL)
ORDER BY s.supplier_id, i.item_id

推荐阅读