近い将来、レポート テーブルとして機能するイメージ サマリー テーブル [summary] があります。参照テーブル [views] と、イメージ チームが入力する 3 番目のテーブル [TeamImage] があります。サマリー テーブルには、部品番号ごとに 1 行 (テーブルには個別の部品番号があります) と、画像ビュー (TOP、BOT、FRO、BAC など) の多数の列があります。[views] テーブルには、これらの各ビューが IDENTITY フィールドである id フィールドとともに一覧表示されます。[TeamImage] テーブルには、部品番号とビューが含まれています (部品番号は画像ビューがあるため、部品番号が複数回リストされるため、部品番号フィールドは一意ではありません)。
例:
TABLE [summary]
Part_Number | TOP | BOT | FRO | BAC |
12345 | | | | |
67890 | | | | |
TABLE [views]
id | View |
1 | TOP |
2 | BOT |
3 | FRO |
4 | BAC |
TABLE [TeamImage]
PartNum | View |
12345 | TOP |
12345 | BOT |
12345 | FRO |
12345 | BAC |
67890 | FRO |
67890 | BAC |
最終的に必要なものは次のとおりです。
TABLE [summary]
Part_Number | TOP | BOT | FRO | BAC |
12345 | 1 | 1 | 1 | 1 |
67890 | | | 1 | 1 |
いくつかの更新クエリを実行できましたが、27 のビューと約 200 万の部品番号があります。変数を列名として使用できないことはわかっていますが、以下のようなものを実行できることを望んでいました。
DECLARE @id int = (SELECT max(id) FROM [views]), @ViewType nvarchar(3);
WHILE @id IS NOT NULL
BEGIN
SELECT @ViewType = (SELECT [View] FROM [views] WHERE id = @id);
UPDATE a
SET a.[@ViewType] = '1'
FROM [summary] a
INNER JOIN [TeamImage] b
AND a.[Part_Number] = b.[PartNum]
WHERE b.[View] = @ViewType;
SELECT @id = max(id) FROM [views] WHERE id < @id;
END;
基本的に、変数を使用して [views] テーブルからさまざまなビューを取得し (id = 27 から id=1 まで ... カウントアップすることもできますが問題にはなりません)、[まとめ】表。
SET a.[@ViewType] = '1' が機能しないことは知っています。私の同僚は VB の使用について言及しましたが、それが本当に最も効率的なオプションであるかどうかはわかりませんでした。[TeamImage] テーブルで PIVOT を使用できることは理解していますが、[summary] テーブル (画像ビュー以外にも多くのフィールドが含まれている) を更新できるかどうかはわかりません。更新クエリを効果的にループするものが必要なようです。ビューごとに 1 つずつ、4 つの更新クエリを作成できます (実際のテーブルには 27 個のビューがあります) が、将来ビューを追加する場合に備えて、より動的なものが必要です。