0

Stack1、Stack2、Stack3、Stack4、Stack5、および Stack6 列にコードを格納するテーブルがあります。ユーザーがこれらのスタックのいずれかのコードの 1 つを削除した場合、残りのコードを自動スタックして、ギャップを最後に移動できるようにする必要があります。

ここに画像の説明を入力

たとえば、上記のスクリーンショットでは、ユーザーが Stack2 のコードを削除したため、Stack3 のコードを Stack2 に、Stack4 のコードを Stack3 に入れたいとします。予想される出力は次のとおりです。

ここに画像の説明を入力

解決策を提案してください。

4

3 に答える 3

1

現在のスキーマを正規化するのは良いことですが、テーブルを更新する 1 つの可能性を次に示します。

;with piv as (
    -- Unpivot the data for ordering
    select csCode, lane, [row], 1 as ordinal, stack1 as stack from MyTable
    union all select csCode, lane, [row], 2 as ordinal, stack2 as stack from MyTable
    union all select csCode, lane, [row], 3 as ordinal, stack3 as stack from MyTable
    union all select csCode, lane, [row], 4 as ordinal, stack4 as stack from MyTable
    union all select csCode, lane, [row], 5 as ordinal, stack5 as stack from MyTable
    union all select csCode, lane, [row], 6 as ordinal, stack6 as stack from MyTable
)
, sort as (
    -- Order the stacks
    select *
        , row_number() over (partition by csCode, lane, [row] order by case when stack = '' then 1 else 0 end, ordinal) as stackNumber
    from piv
)
update a
    set stack1 = (select stack from sort where csCode = a.csCode and lane = a.lane and [row] = a.[row] and stackNumber = 1)
    , stack2 = (select stack from sort where csCode = a.csCode and lane = a.lane and [row] = a.[row] and stackNumber = 2)
    , stack3 = (select stack from sort where csCode = a.csCode and lane = a.lane and [row] = a.[row] and stackNumber = 3)
    , stack4 = (select stack from sort where csCode = a.csCode and lane = a.lane and [row] = a.[row] and stackNumber = 4)
    , stack5 = (select stack from sort where csCode = a.csCode and lane = a.lane and [row] = a.[row] and stackNumber = 5)
    , stack6 = (select stack from sort where csCode = a.csCode and lane = a.lane and [row] = a.[row] and stackNumber = 6)
from MyTable a

いくつかのCTEを使用して、スタックのピボットを解除して順序付けし、相関サブクエリで各スタックを更新しています。これをテーブル全体で実行するか、パフォーマンスを向上させるために必要に応じて where 句を指定できます。

ここにはいくつかの仮定があります。

  • 「空白」データは空の文字列です。スペースとヌルがある可能性がある場合は、それをサニタイズするか、次のようなもので修飾しますltrim(rtrim(coalesce(stack1, ''))) != ''
  • csCode, lane, row候補キーを作成します (一意で、どれも null ではありません)。がそれ自体で主キーである場合、このクエリのいずれにもorcsCodeは必要ありません。lanerow
于 2013-08-27T13:52:43.900 に答える
-1

スタック列がnullかどうかを再帰的にチェックする更新後にトリガーを作成する必要があります。その場合は、スタック[n-1]をスタック[n]で更新し始めます。いい質問です。

よろしく

アシュトッシュ・アリア

于 2013-08-27T12:51:35.433 に答える