2016-01-20 45 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