我有以下两个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
结果
╔════════════╦════════════════╦══════════════╦══════════╦══════════════════╗
║ "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)的一半。另外两个结果是正确的。
我试着在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
发布于 2016-01-20 09:59:49
在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'
如果其中一个查询返回高于一个的值,则源数据中有一个重复值。(您可能需要重复检查视图的查询)。
否则,如果两个查询都返回一个,则联接会出现问题。在这种情况下,请分享您的桌子的结构。
https://stackoverflow.com/questions/34896671
复制相似问题