调整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
相关产品推荐
相关产品推荐

