2013-03-22 44 views
1

對此線程我有一個問題已成功解答。SQL過濾在查詢中按不同列進行重複

searching for filtered duplicates in access query

現在我有一個第二個問題。也許有人可以幫助我。

我有一個查詢,看起來像這樣:

  1. 查詢A_Gravur:

    SP1 | SP2  | SP3 
    
    64 | CB75000 | 3 
    64 | empty | D 
    70 | CB70010 | 1 
    70 | CB70010 | 1 
    119 | CB70050 | 5 
    119 | empty | D 
    165 | S15002 | Schalter 
    165 | S15002 | Schalter 
    194 | R70034 | Poti 
    194 | R10023 | Potentiometer 
    196 | S10063 | Schalter 
    196 | S10063 | Schalter 
    197 | S10063 | Schalter 
    198 | S10070 | 3 
    199 | CB75000 | 5 
    

此查詢由另一個查詢過濾,重複檢查。 最後的結果是這樣的:

結果:

SP1 | SP2  | SP3 

194 | R70034 | Poti 470k 
194 | R10023 | Potentiometer 
196 | S10063 | Schalter 
197 | S10063 | Schalter 
64 | CB75000 | 3 
199 | CB75000 | 5 

和SQL代碼,這看起來像這樣:

SELECT SP1, SP2, SP3 
    FROM A_Gravur 
    WHERE (SP1 IN 
    (SELECT SP1 
     FROM A_Gravur 
     WHERE SP3<>'D' 
     GROUP BY SP1 
     HAVING COUNT(*)>1) 
    OR SP2 IN 
    (SELECT SP2 
     FROM A_Gravur 
     WHERE SP3<>'D' 
     GROUP BY SP2 
     HAVING COUNT(*)>1)) 
    AND CONCAT(CAST(SP1 AS CHAR),SP2,SP3) NOT IN 
    (SELECT CONCAT(CAST(SP1 AS CHAR),SP2,SP3) 
     FROM A_Gravur 
     WHERE SP3 <> 'D' 
     GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2,SP3) 
     HAVING COUNT(*)>1) 
    AND SP3<>'D' 
    ORDER BY SP1, SP2; 

所以現在我的新問題:

我加了2個新列的查詢A_Gravur(SP4和SP5),並做了重複的搜索

SP1 | SP2  | SP3   | SP4  | SP5  | 

194 | R70034 | Poti 470k  |123546 |88859  
194 | R10023 | Potentiometer |88859 | 
196 | S10063 | Schalter  |7773  | 
197 | S10063 | Schalter  |99992 | 
64 | CB75000 | 3    |177777 | 
199 | CB75000 | 5    |99999 | 

說明:在SP4總有值(Materialnumber)。 現在,當我在尋找重複它應該只找到這樣的結果:

SP1 | SP2  | SP3   | SP4  | SP5  | 

196 | S10063 | Schalter  |7773  | 
197 | S10063 | Schalter  |99992 | 
64 | CB75000 | 3    |177777 | 
199 | CB75000 | 5    |99999 | 

,因爲SP5數(88859)亦在SP4(88859)和SP1是中均有記載相同數量( 194)

但如果它看起來像這樣,那麼結果是正確的

SP1 | SP2  | SP3   | SP4  | SP5  | 

194 | R70034 | Poti 470k  |123546 |0000001  
194 | R10023 | Potentiometer |88859 | 
196 | S10063 | Schalter  |7773  | 
197 | S10063 | Schalter  |99992 | 
64 | CB75000 | 3    |177777 | 
199 | CB75000 | 5    |99999 | 

謝謝您的幫助!

+0

我剛剛看到你的問題,我不明白一件事。您是忽略SP5中的值還是必須將其與SP4中的值進行比較? – grahamj42 2013-03-24 12:34:34

+0

我必須將它與sp4進行比較 - 但只有在兩行中的sp1相同時才適用。當sp1重複時,Sp5是我的程序中應該使用的首選材料編號 – user2153413 2013-03-24 13:45:20

+0

我還有點不清楚。 ** 0000001 **從哪裏來的? – grahamj42 2013-03-24 13:55:56

回答

0

這可能會做你想要什麼:

SELECT SP1, SP2, SP3, SP4, SP5 
FROM A_Gravur 
WHERE (SP1 IN 
    (SELECT SP1 
    FROM A_Gravur 
    WHERE SP3<>'D' 
    GROUP BY SP1 
    HAVING COUNT(*)>1) 
OR SP2 IN 
    (SELECT SP2 
    FROM A_Gravur 
    WHERE SP3<>'D' 
    GROUP BY SP2 
    HAVING COUNT(*)>1)) 
AND CONCAT(CAST(SP1 AS CHAR), SP2, 
    CAST(COALESCE(SP5, SP4) AS CHAR)) NOT IN 
    (SELECT CONCAT(CAST(SP1 AS CHAR), SP2, 
    CAST(COALESCE(SP5, SP4) AS CHAR)) 
    FROM A_Gravur 
    WHERE SP3 <> 'D' 
    GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2, 
     CAST(COALESCE(SP5, SP4) AS CHAR)) 
    HAVING COUNT(*)>1) 
AND SP3<>'D' 
ORDER BY SP1, SP2, SP3, SP4; 

CONCAT()選擇的第一個字段是不爲空,所以會選擇SP5如果它存在,否則SP4。

這裏是SQL Fiddle。如果我沒有正確理解,請你修改那裏的測試數據,並添加一個帶有新SQL小提琴地址的評論,這樣我就可以掌握好數據。

+0

你好,我剛剛測試了結果 - 它看起來非常好 - 我明天將測試它在我的工作,然後我會給你我的最終答案 - 非常感謝,直到現在,也許你可以解釋我如何工作,我也會如你所願:--) – user2153413 2013-03-24 21:02:18

+0

如果它行得通,請告訴我,我很樂意編輯答案,以便爲添加其他字段的日期提供一些解釋;-)在你需要的一點點解釋中需要它:我假設SP4和SP5是整數,並使用'CAST(... AS CHAR)'。如果這些字段是字符類型,則不需要投射。 – grahamj42 2013-03-24 21:06:53

+0

嗨,非常好!我需要一點點將coalesce函數轉換爲ms訪問,但現在它工作得很好!非常感謝。現在我可以繼續使用我的vba代碼。 – user2153413 2013-03-25 17:24:19