如何在SQL中实现每个Item对应所有PriceList并补全BasePrice?
解决方法
核心思路是先生成所有商品(Item)与所有存在的价目表(PriceList)的全组合,再与原表关联补全价格,具体步骤如下:
1. 获取所有存在的价目表值
先从原表中提取所有不重复的PriceList,确保覆盖所有动态变化的价目表:
WITH AllPriceLists AS ( SELECT DISTINCT PriceList FROM 你的表名 )
2. 生成商品与价目表的全组合
将所有唯一商品和所有价目表做交叉连接,得到每个商品对应每个价目表的基础框架:
, ItemPriceListPairs AS ( SELECT i.Item, i.BasePrice, pl.PriceList FROM ( SELECT DISTINCT Item, BasePrice FROM 你的表名 ) i CROSS JOIN AllPriceLists pl )
3. 关联原表补全价格
将上面的全组合表与原表左连接,匹配对应Item和PriceList的价格,没有匹配到的就用BasePrice填充:
SELECT p.Item, p.BasePrice, COALESCE(t.Price, p.BasePrice) AS Price, p.PriceList FROM ItemPriceListPairs p LEFT JOIN 你的表名 t ON p.Item = t.Item AND p.PriceList = t.PriceList ORDER BY p.Item, p.PriceList;
补充说明
COALESCE函数会优先取原表的Price值,没有匹配记录时自动用BasePrice填充- 全程依赖动态获取的PriceList集合,后续新增04、05等值时无需修改SQL,自动适配
- 如果原表中存在同一个Item+PriceList的重复记录,需根据业务需求处理,比如用
MAX(t.Price)配合GROUP BY取有效价格
内容的提问来源于stack exchange,提问作者Riël
相关产品推荐
相关产品推荐

