如何新增列判断同Client&ProductID下Amount差值是否非零?
问题:按Client和ProductID分组判断Amount差值是否非零
现有查询语句:
select Client , ProductID, M_POS_TYPE AS Keep_or_Keep_in_Transit, Amount FROM inventory_table inv_table JOIN inventory_position inv_pos ON inv_pos.ProductID=inv_table.ProductID group by Client, ProductID, M_POS_TYPE, Amount
需求:新增一列,检查同一Client和ProductID分组下,Amount列的数值差值是否不等于0(比如5-4≠0时标记为(Y))。已尝试CASE语句,但不确定如何按分组计算差值,需要适用于大量不同ProductID和Client的通用方案。
解决方案提示
- 使用窗口函数结合
PARTITION BY Client, ProductID,在不改变原有GROUP BY逻辑的前提下,直接在SELECT中计算分组内的数值差 - 核心思路:根据业务逻辑选择合适的窗口计算方式:
- 如果是分组内Amount的总和不为0(比如收支抵消后有余额):用
SUM(Amount) OVER(PARTITION BY Client, ProductID) - 如果是分组内最大Amount与最小Amount的差不为0:用
MAX(Amount) OVER(PARTITION BY Client, ProductID) - MIN(Amount) OVER(PARTITION BY Client, ProductID)
- 如果是分组内Amount的总和不为0(比如收支抵消后有余额):用
- 将上述计算嵌入CASE语句,即可生成标记列,示例方向:
CASE WHEN SUM(Amount) OVER(PARTITION BY Client, ProductID) != 0 THEN 'Y' ELSE 'N' END AS Diff_Flag
内容的提问来源于stack exchange,提问作者Lorenzo Castagno
相关产品推荐
相关产品推荐

