0

近い将来、レポート テーブルとして機能するイメージ サマリー テーブル [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 個のビューがあります) が、将来ビューを追加する場合に備えて、より動的なものが必要です。

4

2 に答える 2

1

最終的な要約を作成するには、単純なピボットを使用して実行できますが、これは実行したいくつかのコードに固定されています... SQL には PIVOT コマンドがあることは知っていますが、直接的には十分に慣れていません。

select
      TA.PartNum,
      max( case when TA.TeamImage = 'TOP' then '1' else ' ' end ) as TOPview,
      max( case when TA.TeamImage = 'BOT' then '1' else ' ' end ) as BOTview,
      max( case when TA.TeamImage = 'FRO' then '1' else ' ' end ) as FROview,
      max( case when TA.TeamImage = 'BAC' then '1' else ' ' end ) as BACview
   from
      TeamImage TA
   group by
      TA.PartNum

明らかに簡単に展開できますが、「PIVOT」構文を調べることもできます

于 2013-10-09T17:39:57.680 に答える
0

私はここで質問を少し良くしました: SQL output as variable in VB.netで、私が探していたものに有効な回答を受け取ることができました。DRapp が PIVOT を介してソリューションを提供してくれることに感謝していますが、VB を使用した方が簡単に前進できると思います。つまり、VB と ExecuteScalar および ExecuteNonQuery を使用して、上記の変数を使用してクエリを書き直すことができました。

于 2013-10-15T16:19:00.520 に答える