1

フィールド anln1 と anln2 に異なるエントリを持つすべての行を取得したいと思います。これには、適切な OpenSQL ステートメントが必要です。

たとえば、次の表があります。

anln1 | anln2 | datum    | psp      | przt
------------------------------------------
10007 | 0     | 20140101 | 12345678 | 1
10007 | 0     | 20140101 | 11111111 | 99
10007 | 1     | 20140101 | 12345678 | 1
10007 | 1     | 20140101 | 11111111 | 99

anln1 + anln2のすべてのエントリは、別のサブ番号がある場合、たとえば anln2=1 のように、 datumpsp、およびprztの組み合わせを繰り返す必要があります。

残念ながら、私のテーブルはこの仕様に違反しています (SQLFiddle: http://sqlfiddle.com/#!2/f5d1f ):

anln1 | anln2 | datum    | psp      | przt
------------------------------------------
10000 | 0     | 20140101 | 12345678 | 60
10000 | 0     | 20140101 | 11111111 | 40
10000 | 1     | 20140101 | 11111111 | 100
10000 | 2     | 20140101 | 11111111 | 100
10000 | 3     | 20140101 | 22222222 | 100
10001 | 0     | 20140101 | 12312312 | 100
10001 | 1     | 20140101 | 12312312 | 100
10001 | 2     | 20140101 | 12312312 | 100
10002 | 0     | 20140101 | 11111111 | 100
10003 | 0     | 20140101 | 11111111 | 100
10004 | 0     | 20140101 | 11111111 | 100
10005 | 0     | 20140101 | 22222222 | 100
10005 | 1     | 20140101 | 33333333 | 100
10006 | 0     | 20140101 | 11111111 | 20
10006 | 0     | 20140101 | 22222222 | 80
10006 | 1     | 20140101 | 11111111 | 30
10006 | 1     | 20140101 | 11111111 | 70
10007 | 0     | 20140101 | 12345678 | 1
10007 | 0     | 20140101 | 11111111 | 99
10007 | 1     | 20140101 | 12345678 | 1
10007 | 1     | 20140101 | 11111111 | 99

私のクエリの結果として、仕様に違反しているすべての行を特定する必要があります。正しい行はそのままにしておく必要があります。正しい行は、anln1 が 10001、10002、10003、10004、10007 の行です。

したがって、結果は次のようになります。

anln1 | anln2 | datum    | psp      | przt
------------------------------------------
10000 | 0     | 20140101 | 12345678 | 60
10000 | 0     | 20140101 | 11111111 | 40
10000 | 1     | 20140101 | 11111111 | 100
10000 | 2     | 20140101 | 11111111 | 100
10000 | 3     | 20140101 | 22222222 | 100
10005 | 0     | 20140101 | 22222222 | 100
10005 | 1     | 20140101 | 33333333 | 100
10006 | 0     | 20140101 | 11111111 | 20
10006 | 0     | 20140101 | 22222222 | 80
10006 | 1     | 20140101 | 11111111 | 30
10006 | 1     | 20140101 | 11111111 | 70

GROUP BY、HAVING、および COUNT(...) > 1 を試してみましたが、有用な結果にはなりませんでした。これは(Open)SQLでも解決できますか?

あなたの助けを本当に楽しみにしています!私の SQLFiddle ( http://sqlfiddle.com/#!2/f5d1f ) を使用して試してみてください。

4

2 に答える 2

0

anln2 <> 0 でエントリを選択した後、内部テーブルで作業しました。

まず、選択した結果を次のように並べ替えました。

 SORT gt_internaltable BY anln1 anln2 datum psp przt. 

次に、内部テーブルをループして、すべての二重エントリを削除しました...

 LOOP AT gt_internaltable INTO gs_tablerow.
    AT NEW anln1.
      CLEAR g_count.
    ENDAT.

    g_count = g_count + 1.

    AT END OF anln1.
      IF g_count > 1. " delete double entries
        DELETE gt_internaltable WHERE anln1 = gs_tablerow-anln1
                         AND   anln2 = gs_tablerow-anln2
                         AND   datum = gs_tablerow-datum
                         AND   psp = gs_tablerow-psp
                         AND   przt = gs_tablerow-przt.
      ENDIF.
    ENDAT.
  ENDLOOP.

最終的に、仕様に違反するエントリのリストがgt_internaltableに残されます。

于 2015-06-30T10:25:25.960 に答える