oracle sql join SUM结果在某些行上加倍

时间:2016-01-20 09:51:04

标签: sql oracle group-by inner-join

我有以下两个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

1 个答案:

答案 0 :(得分:0)

INVENT_VIEWCTLGRP内的第一条记录可能存在重复。

检查这两个查询,如果数据正确,每个查询应返回一个:

-- 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,则源数据中会出现重复。 (您可能需要仔细检查视图的查询。)

否则,如果两个查询都返回一个,那么您的联接就会出现问题。在这种情况下,请分享您的表格结构。