1

このスレッドで私は首尾よく答えられた質問をしました。

アクセスクエリでフィルタリングされた重複を検索する

今、私は2番目の問題を抱えています。多分誰かが私を助けることができます。

次のようなクエリがあります。

  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;

だから今私の新しい問題:

クエリA_Gravur(SP4およびSP5)に2つの新しい列を追加し、重複検索を実行しました

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には常に値(材料番号)があります。今、私が重複を検索しているとき、それはこの結果だけを見つけるはずです:

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    |

ご協力ありがとうございました!!

4

1 に答える 1

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()nullではない最初のフィールドを選択するため、存在する場合はSP5を選択し、存在しない場合はSP4を選択します。

これがSQLフィドルです。正しく理解していない場合は、そこでテストデータを修正し、新しいSQL Fiddleのアドレスをコメントに追加してください。そうすれば、作業に適したデータが得られます。

于 2013-03-24T19:14:02.990 に答える