2016-02-26 65 views
0

我正在SSRS查詢oracle數據庫。只想返回在unitid內有重複unitid的行的行數

所以我有一個數據源,這個報告應該根據一個獨特的unitid上的多個開放工作單找到重複的工作單。所以我只想顯示具有多於一個條目的組,因爲它們按照unitid分組。

SELECT 
COMPSTSB.UNITID, 
COMPSTSB.UNITTYPE, 
ACTDEFN.ACTDESC, 
ACTDEFN.ACTCODE, 
HISTORY.WONO, 
HISTORY.COMPFLAG, 
HISTORY.ADDDTTM, 
HISTORY.COMMENTS 
FROM (IMSV7.COMPSTSB COMPSTSB INNER JOIN IMSV7.HISTORY HISTORY ON 
COMPSTSB.COMPKEY=HISTORY.COMPKEY) INNER JOIN IMSV7.ACTDEFN ACTDEFN ON 
HISTORY.ACTKEY=ACTDEFN.ACTKEY 
WHERE HISTORY.COMPFLAG='Y' AND NOT (ACTDEFN.ACTCODE='DBR' OR  ACTDEFN.ACTCODE='IN') 
ORDER BY COMPSTSB.UNITTYPE, COMPSTSB.UNITID, HISTORY.ADDDTTM 

任何人都可以指向正確的方向嗎?是的,有人說這已被問了一百萬次,我沒有搜索。指向我百萬次,我會看看我是否覺得他們符合我的問題。理想情況下,在SQL中,我可以創建一個返回countid的新列,並且我嘗試了這個但失敗了,然後我可以在該列上進行過濾以刪除只有一個計數的列。我真的不認爲這應該是困難的,但我迄今爲止花了大約4個小時。

提前致謝! Steven

回答

0

如果我明白你的問題吧,下面應該給你所需的內容:

SELECT * FROM 
(
SELECT 
COMPSTSB.UNITID, 
COMPSTSB.UNITTYPE, 
ACTDEFN.ACTDESC, 
ACTDEFN.ACTCODE, 
HISTORY.WONO, 
HISTORY.COMPFLAG, 
HISTORY.ADDDTTM, 
HISTORY.COMMENTS, 
COUNT(1) OVER (PARTITION BY COMPSTSB.UNITID) AS numDups 
FROM (IMSV7.COMPSTSB COMPSTSB INNER JOIN IMSV7.HISTORY HISTORY ON 
COMPSTSB.COMPKEY=HISTORY.COMPKEY) INNER JOIN IMSV7.ACTDEFN ACTDEFN ON 
HISTORY.ACTKEY=ACTDEFN.ACTKEY 
WHERE HISTORY.COMPFLAG='Y' AND NOT (ACTDEFN.ACTCODE='DBR' OR  ACTDEFN.ACTCODE='IN') 
)a 
WHERE a.numDups >1 
ORDER BY COMPSTSB.UNITTYPE, COMPSTSB.UNITID, HISTORY.ADDDTTM 
0

我希望你擔心IMSV7.COMPSTSB表中有UNITID的重複值。如果是這樣添加此連接到您的查詢應使歐識別它們:

JOIN (SELECT COMPSTSB.UNITID 
     FROM IMSV7.COMPSTSB 
     GROUP BY COMPSTSB.UNITID 
     HAVING COUNT(COMPSTSB.UNITID) > 1) dups 
    ON DUPS.UNITID = COMPSTSB.UNITID 
JOIN IMSV7.HISTORY HISTORY 

下面是完整的查詢:

SELECT COMPSTSB.UNITID 
     , COMPSTSB.UNITTYPE 
     , ACTDEFN.ACTDESC 
     , ACTDEFN.ACTCODE 
     , HISTORY.WONO 
     , HISTORY.COMPFLAG 
     , HISTORY.ADDDTTM 
     , HISTORY.COMMENTS 
    FROM IMSV7.COMPSTSB COMPSTSB 
    JOIN (SELECT COMPSTSB.UNITID 
      FROM IMSV7.COMPSTSB 
      GROUP BY COMPSTSB.UNITID 
     HAVING COUNT(COMPSTSB.UNITID) > 1) dups 
    ON DUPS.UNITID = COMPSTSB.UNITID 
    JOIN IMSV7.HISTORY HISTORY 
    ON COMPSTSB.COMPKEY = HISTORY.COMPKEY 
    JOIN IMSV7.ACTDEFN ACTDEFN 
    ON HISTORY.ACTKEY = ACTDEFN.ACTKEY 
    WHERE HISTORY.COMPFLAG = 'Y' 
    AND ACTDEFN.ACTCODE NOT IN ('DBR','IN') 
    ORDER BY COMPSTSB.UNITTYPE 
     , COMPSTSB.UNITID 
     , HISTORY.ADDDTTM; 

由於上述查詢沒有工作,你可以嘗試外連接到類似的子查詢每個表並限制外連接表返回數據的記錄。這將顯示您這在查詢表cuasing你的額外行:

SELECT COMPSTSB.UNITID 
     , COMPSTSB.UNITTYPE 
     , ACTDEFN.ACTDESC 
     , ACTDEFN.ACTCODE 
     , HISTORY.WONO 
     , HISTORY.COMPFLAG 
     , HISTORY.ADDDTTM 
     , HISTORY.COMMENTS 
     , DUPS.UNITID UNITID_DUP 
     , DUPS2.COMPKEY COMPKEY_DUP 
     , DUPS3.ACTKEY ACTKEY_DUP 
    FROM IMSV7.COMPSTSB COMPSTSB 
    JOIN IMSV7.HISTORY HISTORY 
    ON COMPSTSB.COMPKEY = HISTORY.COMPKEY 
    JOIN IMSV7.ACTDEFN ACTDEFN 
    ON HISTORY.ACTKEY = ACTDEFN.ACTKEY 
    LEFT JOIN (SELECT COMPSTSB.UNITID 
      FROM IMSV7.COMPSTSB 
      GROUP BY COMPSTSB.UNITID 
     HAVING COUNT(COMPSTSB.UNITID) > 1) dups 
    ON DUPS.UNITID = COMPSTSB.UNITID 
    LEFT JOIN (SELECT HISTORY.COMPKEY 
      FROM IMSV7.HISTORY 
      GROUP BY HISTORY.COMPKEY 
     HAVING COUNT(HISTORY.COMPKEY) > 1) dups2 
    ON DUPS.UNITID = COMPSTSB.UNITID 
    LEFT JOIN (SELECT ACTDEFN.ACTKEY 
      FROM IMSV7.ACTDEFN 
      GROUP BY ACTDEFN.ACTKEY 
     HAVING COUNT(ACTDEFN.ACTKEY) > 1) dups3 
    ON DUPS.UNITID = COMPSTSB.UNITID 
    WHERE HISTORY.COMPFLAG = 'Y' 
    AND ACTDEFN.ACTCODE NOT IN ('DBR','IN') 
    AND (DUPS.UNITID IS NOT NULL OR 
      DUPS2.COMPKEY IS NOT NULL OR 
      DUPS3.ACTKEY IS NOT NULL) 
    ORDER BY COMPSTSB.UNITTYPE 
     , COMPSTSB.UNITID 
     , HISTORY.ADDDTTM; 
+0

我probally寫了我原來的問題不好。您的查詢返回零行,並且都帶有&。如果我在HAVING COUNT(COMPSTSB.UNITID)> 1)dups行上使用=,那麼我得到的結果與我原來的查詢相同,它顯示了具有唯一UNITID的行和具有重複UNITID的行(這就是我想要的返回,所有重複項) – aquariumjunky

+0

這隻意味着表COMPSTSB中UNITID的所有實例都是唯一的。問題是你加入哪張表的行數比你想要的要多。您的HISTORY Table有多個COMPKEY實例,或者您的ACTDEFN表有多個ACTKEY實例。你可以在這些表上嘗試類似的連接來找到罪魁禍首。 – Sentinel