我有以下两条SQL语句,它们在某些行上返回的总和是双倍的,并且希望有一些帮助排序。oracle sql join在某些行上SUM结果加倍
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)。另外两个结果是正确的。
我已经试过在总结后放置DISTINCT,但是这只是返回第一行3600的第一个值。我也在SELECT语句之后放置了不同的右键,但这没什么区别。
真的很感谢这方面的帮助。
谢谢。
UPDATE
多亏了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
给我们你的数据结构和输入,它很难看到这样的问题。我认为你可能有重复的行,这就是为什么你得到X2 – sagi
你需要提供所有涉及的表的样本数据,以及你提供的输出。你有没有尝试运行查询没有总和/组?这样,你应该能够看到行重复的位置;我的猜测是,至少有一个连接是1对多,而不是1对1,这意味着您的输出最终可能会比您期望的行数多。 – Boneist
你有一个重复行(使用数据明智)是你的任何表。这就是为什么它的总和翻倍。 – Viplock