1

これは本当に単純な問題のように思えますが、私は今それを理解できないようです...

これは、現在のストアドプロシージャからフェッチしているデータの簡略化されたビューです。

ID     Name         Class     Desc
---    -----        ------    -----
84     Calvin J.    2B
53     Fred D.      3B
53     Fred D.      ADJ       Change/Correction
47     Mary F.      3A
47     Mary F.      ADJ       New Product
09     Donald M.    ADJ       Cancelled
21     Richard G.   ADJ       Bad Debt
21     Richard G.   ADJ       Cancelled

個人ごとに1つのレコードのみを選択するように手順を変更する必要があります。人に調整がある場合は、調整のあるレコードのみを選択し、他のレコードは無視します。上記に基づいて、これは私が返そうとしている結果セットです:

ID     Name         Class     Desc
---    -----        ------    -----
84     Calvin J.    2B
53     Fred D.      ADJ       Change/Correction
47     Mary F.      ADJ       New Product
09     Donald M.    ADJ       Cancelled
21     Richard G.   ADJ       Cancelled

助けてください!

アップデート

このクエリには追加の要件があることに気づきました。1つに「貸倒れ」の説明があり、もう1つに「キャンセル済み」の説明がある、2つの調整がある場合は、「キャンセル済み」の説明のあるレコードを選択する必要があります(上記の更新データを参照)。

4

1 に答える 1

0

これでうまくいくはずです:

SELECT ID, Name, Class, [Desc]
FROM (
  SELECT ID, Name, Class, [Desc],
         ROW_NUMBER() OVER(PARTITION BY ID
                           ORDER BY CASE WHEN Class = 'ADJ'
                                         THEN 0 ELSE 1 END) rn
  FROM Table1
) A
WHERE rn = 1

それは実際よりも怖いように見えます。内部クエリには、で計算された追加の列が含まれていますROW_NUMBER()IDこれは、行に番号を付け、個別の(で指定されている)ごとに1から始めますPARTITION BY。行のORDER BY順序付け方法を示す、は、の行が他のすべての行の前に来る必要がROW_NUMBER()あることを示すcaseステートメントです。Class = 'ADJ'次に、最後に1の番号が付けられた行のみを取得します。その結果、ADJ行がある場合はADJ行が選択され、IDそれ以外の場合は通常の行が選択されます。

更新された要件に応じて編集する追加の優先順位付け基準がある場合は、通常のクエリの場合と同じように、
それらをに追加できます。多くの場合、行番号がどのように割り当てられているかを正確に確認できるように、にフィルターをかけずに内部クエリのみを実行すると便利です。ORDER BYORDER BYrn = 1

新しい要件を満たす必要がある更新されたクエリは次のとおりです。

SELECT ID, Name, Class, [Desc]
FROM (
  SELECT ID, Name, Class, [Desc],
         ROW_NUMBER() OVER(PARTITION BY ID
                           ORDER BY
                             CASE WHEN Class = 'ADJ'
                                  THEN 0 ELSE 1 END,
                             CASE WHEN [Desc] = 'Cancelled'
                                  THEN 0 ELSE 1 END) rn
  FROM Table1
) A
WHERE rn = 1

ここで実際の動作を確認してください。

于 2012-11-07T21:18:53.693 に答える