You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改SQL查询将PO Amount列的重复值置为0?

解决方案

要实现将PO Amount列的重复值置为0的需求,我们可以借助窗口函数识别重复行,再通过CASE语句替换重复值。以下是完善后的SQL查询:

场景1:按PO编号分组,同一PO下重复金额置为0

适用于同一采购订单(PO Number)内存在重复金额的情况,仅保留每组内的第一个金额值,其余重复项设为0:

SELECT
    t1.[PO Number],
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY t1.[PO Number], t1.[PO Amount] ORDER BY (SELECT NULL)) > 1 
        THEN 0 
        ELSE t1.[PO Amount] 
    END AS [PO Amount],
    -- 显式列出PO_Table的其他列,替换为你的实际列名
    t1.[PO Date],
    t1.[Supplier ID],
    t2.*
FROM
    PO_Table t1
LEFT JOIN
    SI_Table t2 ON t1.[PO Number] = t2.[PO Number]

场景2:全局范围重复金额置为0

如果需要整个结果集中所有重复的PO Amount(无论所属PO编号)都置为0,仅保留第一次出现的金额值:

SELECT
    t1.[PO Number],
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY t1.[PO Amount] ORDER BY (SELECT NULL)) > 1 
        THEN 0 
        ELSE t1.[PO Amount] 
    END AS [PO Amount],
    -- 显式列出PO_Table的其他列
    t1.[PO Date],
    t1.[Supplier ID],
    t2.*
FROM
    PO_Table t1
LEFT JOIN
    SI_Table t2 ON t1.[PO Number] = t2.[PO Number]

关键说明

  • 避免使用t1.*:因为我们需要替换原PO Amount列,显式列出其他列能保证结果符合预期,部分数据库(如PostgreSQL 12+)支持SELECT t1.* EXCLUDE ([PO Amount], ...)语法简化,但显式列兼容性更强。
  • 排序逻辑:ORDER BY (SELECT NULL)是兼容多数据库的无意义排序,如果你需要按特定规则保留第一条(比如按订单创建时间),可以替换为实际列,例如t1.[PO Date] DESC。

内容的提问来源于stack exchange,提问作者baby3boss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:23:12