如何在SQL Server中基于条件获取下一行值填充价格区间上限?
解决SAP B1价格断点同步至WordPress的结束值计算问题
针对你在SQL Server上处理SAP B1价格断点同步的需求,我们可以利用**窗口函数LEAD()**来获取同客户同物料的下一个断点起始数量,进而计算当前断点的结束值。
完整SQL实现代码
SELECT T2.CardCode, T2.ItemCode, T2.Amount AS [From], -- 计算结束值:如果存在同CardCode+ItemCode的下一行,取其From值减1,否则留空 CASE WHEN LEAD(T2.Amount) OVER (PARTITION BY T2.CardCode, T2.ItemCode ORDER BY T2.Amount) IS NOT NULL THEN LEAD(T2.Amount) OVER (PARTITION BY T2.CardCode, T2.ItemCode ORDER BY T2.Amount) - 1 ELSE NULL END AS [To], T2.Price FROM SPP2 T2 WHERE T2.ItemCode IN ('QMB01','QMB02') AND T2.CardCode IN ('*12','*13') -- 按客户和物料分组后,按起始数量排序,确保断点顺序正确 ORDER BY T2.CardCode, T2.ItemCode, T2.Amount
代码说明
- LEAD()窗口函数:
LEAD(T2.Amount) OVER (PARTITION BY T2.CardCode, T2.ItemCode ORDER BY T2.Amount)用于在同一个CardCode(客户编码)和ItemCode(物料编码)分组内,获取当前行的下一行的Amount(起始数量)值。 - CASE逻辑:判断是否存在下一行的起始数量,如果存在则减1作为当前断点的结束值;如果是分组内的最后一行,则
To字段设为NULL(留空)。 - 排序规则:通过
ORDER BY T2.Amount保证断点按起始数量从小到大排列,确保下一行的取值逻辑正确。
示例效果
假设原数据为:
| CardCode | ItemCode | Amount | Price |
|---|---|---|---|
| *12 | QMB01 | 1 | 100 |
| *12 | QMB01 | 10 | 90 |
| *12 | QMB01 | 20 | 80 |
执行代码后结果为:
| CardCode | ItemCode | From | To | Price |
|---|---|---|---|---|
| *12 | QMB01 | 1 | 9 | 100 |
| *12 | QMB01 | 10 | 19 | 90 |
| *12 | QMB01 | 20 | NULL | 80 |
内容的提问来源于stack exchange,提问作者Andy Gray
相关产品推荐
相关产品推荐

