1

SQLの入力となるこれに似たテーブルがあります

    ID                     Value
    FRY6040501ACH19        1388
    FRY6040501ACH19        1389
    FRY6040501ACH19        1388
    <Null>                 13800
    <Null>                 13800
    <Null>                 <Null>
    0026003710022745       1388
    0026003710022752       <Null>
    0026003710022751       32750
    0026003710022751       32750
    0026003710022751       32750

Status列を追加して出力を取得するには、SQL を記述する必要があります。

ロジックを説明するために中間列を追加していTmpCntIDますTmpCntVl

SQL からの必要な出力は次のとおりです: ( TmpCntID&TmpCntVl不要)

    ID               TmpCntID     Value    TmpCntVl   Status
    FRY6040501ACH19      3        1388       2        MisMatch
    FRY6040501ACH19      3        1389       1        MisMatch
    FRY6040501ACH19      3        1388       2        MisMatch
    <Null>               3        13800      2        MisMatch
    <Null>               3        13800      2        MisMatch
    <Null>               3        <Null>     1        MisMatch
    0026003710022745     1        1388       1        NA
    0026003710022752     1        <Null>     1        NA
    0026003710022751     3        32750      3        Match
    0026003710022751     3        32750      3        Match
    0026003710022751     3        32750      3        Match

ここで使用されるロジックは、中間出力を次SELECT ID, Count(*) FROM MyTable M GROUP BY IIF(IsNull(ID), '0', ID), ID having COUNT(*)>1のように取得するために使用する繰り返しを持つ ID を最初に見つけることです。

    NDUPID            TmpCntID
    FRY6040501ACH19      3
    <Null>               3
    0026003710022751     3

ここで、ID の残りの部分を無視する必要があります00260037100227450026003710022752

上記の最初の表から、非重複の検索にIDあるそれぞれについて。1 つの非重複は、同じであるすべての行を示す必要があります。NDUPID (above intermediate output)valuesIDMismatch

に対しての例でID=0026003710022751は、3つすべてを見ることができvalues=32750、したがってStatus=Match、およびID=FRY6040501ACH19ID=<Null>少なくとも1つの重複がvalueあるため、Status=Mismatch

上記の出力テーブルではTmpCntID=1、 を持つすべての行について、Status=NA

念頭に置いているロジックはTmpCntVlTmpCntID最初に を計算することですが、最終出力では必要ありません。次に、両方の列が等しい場合は case ステートメントを使用し、両方の列が等しくMatchない場合は、上記の中間出力テーブルにないMisMatchすべてのID's に対して、つまりステータスはcount(*)<=1NA

どうぞよろしくお願いいたします。

4

1 に答える 1

1

Status何かが足りないかもしれませんが、列の定義を次のようにしたいと思われます。

SELECT CASE WHEN TmpCntID = 1 THEN 'NA'
     WHEN EXISTS(SELECT 1 FROM interTbl tt 
                 WHERE tt.ID = tbl.ID AND tt.TmpCntVl = 1)
          THEN 'MisMatch'
     ELSE 'Match'
END AS Status
FROM interTbl tbl

あれは、

  • NAユニークなとき
  • MisMatchTmpCntVlそのためのいずれかIDが1の場合
  • Matchそうでなければ

あなたが中間出力を取得する方法を知っていて、そこからどのように進めるかを知らなかったという点で、私は質問を誤解しました。これが私がすることです:

WITH Counts AS
(
    SELECT ID, Count(*) AS TmpCntID
    FROM myTable
    GROUP BY ID
),
LoneValues AS
(
    SELECT ID
    FROM myTable
    GROUP BY ID, Value
    HAVING COUNT(*) = 1
)
SELECT myTable.ID, myTable.Value,
    CASE WHEN Counts.TmpCntID = 1 THEN 'NA'
         WHEN EXISTS(SELECT 1 FROM LoneValues WHERE myTable.ID = LoneValues.ID
                           OR (myTable.ID IS NULL AND LoneValues.ID IS NULL))
              THEN 'MisMatch'
         ELSE 'Match'
    END AS Status
FROM myTable
INNER JOIN Counts ON myTable.ID = Counts.ID 
    OR (myTable.ID IS NULL AND Counts.ID IS NULL)

これが最適な解決策であるとは限りません。後で問題が発生した場合は、修正方法を検討してください。

また、SQL Fiddleでこのクエリを試したので、実際の動作を確認できます。RDBMSがCTEをサポートしていない場合は、もちろん、必要に応じてサブクエリとしてCTEを貼り付けることができます。

于 2013-01-19T11:46:58.147 に答える