我有以下两个SQL语句,它们在某些行上返回两倍的总和,并希望得到一些帮助排序。
SELECT *
FROM (
SELECT A.ITMCOD
,I.ITMDSC
,A.CTLGRP
,SUM(A.CASQTY) thesum
,(C.FIFODT + I.STPSHP) STOP_SHIP_DATE
FROM INVENT_VIEW A
INNER JOIN ITMMST I ON A.ITMCOD = I.ITMCOD
INNER JOIN CTLGRP C ON A.CTLGRP = C.CTLGRP
WHERE A.ITMCOD LIKE 'PS%687%'
GROUP BY A.ITMCOD
,I.ITMDSC
,A.CTLGRP
,C.FIFODT
,I.STPSHP
)
ORDER BY ITMCOD
我的第二次试验,我认为连接是问题,并返回相同的结果如下:
SELECT INVENT_VIEW.ITMCOD
,ITMMST.ITMDSC
,CTLGRP.CTLGRP
,SUM(INVENT_VIEW.CASQTY) thesum
,(CTLGRP.FIFODT + ITMMST.STPSHP) STOP_SHIP_DATE
FROM INVENT_VIEW
,CTLGRP
,ITMMST
WHERE ITMMST.ITMCOD = INVENT_VIEW.ITMCOD
AND (CTLGRP.CTLGRP = INVENT_VIEW.CTLGRP)
AND (INVENT_VIEW.ITMCOD LIKE 'PS%687%')
GROUP BY INVENT_VIEW.ITMCOD
,ITMMST.ITMDSC
,CTLGRP.CTLGRP
,CTLGRP.FIFODT
,ITMMST.STPSHP
RESULT
╔════════════╦════════════════╦══════════════╦══════════╦══════════════════╗
║ "ITMCOD" ║ "ITMDSC" ║ "CTLGRP" ║ "THESUM" ║ "STOP_SHIP_DATE" ║
╠════════════╬════════════════╬══════════════╬══════════╬══════════════════╣
║ "PS00687A" ║ "gROOVY BRUSH" ║ "4066ZDPOO4" ║ 93600 ║ 26-DEC-16 ║
║ "PS00687A" ║ "gROOVY BRUSH" ║ "5385POSOO4" ║ 3600 ║ 08-MAY-18 ║
║ "PS00687A" ║ "gROOVY BRUSH" ║ "5299POS001" ║ 9922 ║ 08-MAY-18 ║
╚════════════╩════════════════╩══════════════╩══════════╩══════════════════╝
错误在第一行,其中总和应该是显示的一半(46800)。另外两个结果是正确的。
我已经尝试将DISTINCT放在sum之后,但是这只返回第一行的第一个值3600.我也在SELECT语句之后放置了不同的但是没有区别。
真的很感谢这方面的帮助。
谢谢。更新
感谢mef谁对联合表中的重复是正确的,我能够得到我想要的结果!我还编辑了SQL:
SELECT *
FROM (
SELECT A.ITMCOD
,I.ITMDSC
,A.CTLGRP
,SUM(A.CASQTY) QTY
,CASE
WHEN C.STPDAT IS NOT NULL
THEN C.STPDAT
ELSE (C.FIFODT + I.STPSHP)
END AS STOP_SHIP_DATE
FROM INVENT_VIEW A
INNER JOIN ITMMST I ON A.ITMCOD = I.ITMCOD
INNER JOIN CTLGRP C ON (
(A.CTLGRP = C.CTLGRP)
AND (A.ITMCOD = C.ITMCOD) <- added
)
WHERE A.ITMCOD LIKE 'PS%'
AND C.QASTAT = 'RL' <- added
GROUP BY A.ITMCOD
,I.ITMDSC
,A.CTLGRP
,C.FIFODT
,I.STPSHP
,C.STPDAT
)
ORDER BY ITMCOD
答案 0 :(得分:0)
INVENT_VIEW
或CTLGRP
内的第一条记录可能存在重复。
检查这两个查询,如果数据正确,每个查询应返回一个:
-- check whether there is a duplicate inside INVENT_VIEW
select count(1) from INVENT_VIEW where CTLGRP = '4066ZDPOO4' and ITMCOD = 'PS00687A'
-- check whether there is a duplicate inside CTLGRP
select count(1) from CTLGRP where CTLGRP = '4066ZDPOO4'
如果其中一个查询返回的值大于1,则源数据中会出现重复。 (您可能需要仔细检查视图的查询。)
否则,如果两个查询都返回一个,那么您的联接就会出现问题。在这种情况下,请分享您的表格结构。