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

调整ECOMMERCE售价匹配ENFIELD时出现重复条目求助

解决SQL查询重复记录问题的方案

嘿,我来帮你拆解一下这个问题~你遇到的重复记录问题,根源在于你的LEFT JOIN逻辑导致了一对多的连接关系:

问题原因分析

你的原SQL里,T1(ECOMMERCE/ENFIELD门店的SKU 18760记录)和T2(同SKU但不同门店的记录)做连接时,只限定了SKU匹配和门店不同,但没有限制T2的日期范围,也没确保ENFIELD门店的该SKU记录是唯一的。如果DAILYSALES表中ENFIELD门店的SKU 18760有多条符合条件的记录(比如多个日期的销售数据),那么ECOMMERCE的每条记录都会和这些ENFIELD的记录一一关联,直接导致结果出现重复行。

另外你加的GROUP BY其实没起到去重作用,因为你把T1.CURNORMALSELL和T2.CURNORMALSELL都放进了分组条件里,不同的T2售价还是会被分成不同的组。

修正后的SQL方案

我们可以先单独获取ENFIELD门店SKU 18760的唯一售价(比如取最新日期的,或者用聚合函数确保唯一),再和ECOMMERCE的记录做连接,这样就能避免一对多的情况。

方案1:取最新日期的ENFIELD售价(适合售价可能随时间变化的场景)

SELECT 
    T1.STRTRADECODE AS [STORE], 
    T1.LINTITEMNUMBER AS [SKU], 
    CASE 
        WHEN T1.STRTRADECODE = 'ECOMMERCE' THEN T2.CURNORMALSELL 
        ELSE T1.CURNORMALSELL 
    END AS [SELLINGPRICE]
FROM DAILYSALES T1
LEFT JOIN (
    -- 子查询获取ENFIELD门店SKU 18760的最新售价
    SELECT 
        LINTITEMNUMBER, 
        CURNORMALSELL
    FROM DAILYSALES
    WHERE STRTRADECODE = 'ENFIELD'
      AND LINTITEMNUMBER = '18760'
      AND DTMTRADEDATE >= '2018-01-02 00:00:00'
      AND STRSALETYPE = 'I'
    ORDER BY DTMTRADEDATE DESC
    LIMIT 1 -- 只取最新的一条记录
) T2 ON T1.LINTITEMNUMBER = T2.LINTITEMNUMBER
WHERE 
    T1.DTMTRADEDATE >= '2018-01-02 00:00:00' 
    AND T1.STRSALETYPE = 'I' 
    AND T1.STRTRADECODE IN ('ECOMMERCE', 'ENFIELD') 
    AND T1.LINTITEMNUMBER = '18760'
ORDER BY T1.STRTRADECODE DESC

方案2:用聚合函数获取唯一售价(适合该SKU在ENFIELD门店售价始终一致的场景)

SELECT 
    T1.STRTRADECODE AS [STORE], 
    T1.LINTITEMNUMBER AS [SKU], 
    CASE 
        WHEN T1.STRTRADECODE = 'ECOMMERCE' THEN T2.CURNORMALSELL 
        ELSE T1.CURNORMALSELL 
    END AS [SELLINGPRICE]
FROM DAILYSALES T1
LEFT JOIN (
    -- 用MAX/MIN确保只返回一条售价记录,即使有多个ENFIELD的记录
    SELECT 
        LINTITEMNUMBER, 
        MAX(CURNORMALSELL) AS CURNORMALSELL
    FROM DAILYSALES
    WHERE STRTRADECODE = 'ENFIELD'
      AND LINTITEMNUMBER = '18760'
      AND DTMTRADEDATE >= '2018-01-02 00:00:00'
      AND STRSALETYPE = 'I'
    GROUP BY LINTITEMNUMBER
) T2 ON T1.LINTITEMNUMBER = T2.LINTITEMNUMBER
WHERE 
    T1.DTMTRADEDATE >= '2018-01-02 00:00:00' 
    AND T1.STRSALETYPE = 'I' 
    AND T1.STRTRADECODE IN ('ECOMMERCE', 'ENFIELD') 
    AND T1.LINTITEMNUMBER = '18760'
ORDER BY T1.STRTRADECODE DESC

效果说明

这两种方案都会让T2只返回ENFIELD门店SKU 18760的一条售价记录,和T1连接时就不会产生一对多的关联,自然就能消除重复记录了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:39:04