2016-01-20 129 views
2

我有以下两条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 
+0

给我们你的数据结构和输入,它很难看到这样的问题。我认为你可能有重复的行,这就是为什么你得到X2 – sagi

+1

你需要提供所有涉及的表的样本数据,以及你提供的输出。你有没有尝试运行查询没有总和/组?这样,你应该能够看到行重复的位置;我的猜测是,至少有一个连接是1对多,而不是1对1,这意味着您的输出最终可能会比您期望的行数多。 – Boneist

+0

你有一个重复行(使用数据明智)是你的任何表。这就是为什么它的总和翻倍。 – Viplock

回答

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' 

如果其中一个查询返回上面比一的值,那么在重复你的源数据。 (您可能想要仔细检查视图的查询)。

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

+0

@ downvoter>请解释我写的答案中的问题。我想我给了OP正确的方向以解决这类问题,并且他将能够将其应用于将来会遇到的这个和其他类似问题。 –

+0

嗨,不知道为什么这是downvoted,但这实际上是我得到这些结果的原因!所以谢谢mef!我编辑了SQL以进一步隔离在内部联接子句中包含ITMCOD和QASTAT列所返回的结果。生病编辑答案来表明这一点。队友的欢呼声 – Nick