0

利用可能なすべてのアイテムを保持する一時的なテーブルがあります

#TableA

ItemId  ItemName    ItemVer
1       Name1       2
2       Name2       9
3       Name3       5
.
.
.
500     Name500     3

次に、SnapshotIdとともにSnapshotが取得されたすべての日付を保持する別のものがあります

CREATE TABLE #tmpSnapshot_Dates(
[SnapshotId] [uniqueidentifier] NOT NULL,
[DateTaken] datetime NOT NULL) 

INSERT INTO #tmpSnapshot_Dates SELECT SnapshotId, DateTaken From Snapshot_Info Where DateTaken <= @EndDate

ここで、テーブル内の各日付について、#tmpSnapshot_Dates各アイテムに関連するカウントを取得したいと思います

SELECT ItemId, Count(*) From Items Where SnapshotId = @SnapshotId

#TableA次に、列を追加して更新します

DECLARE @ColName VARCHAR(100)
SET @ColName = 'Installed ' + CONVERT(Varchar, @DateA, 6)

exec('ALTER TABLE #TableA ADD ['+@ColName+']  int NOT NULL CONSTRAINT [DF_#TableA_Installed on] DEFAULT 0')

次に、データを新しい列に挿入します。次に、日付ごとにこれを繰り返す必要があります#tmpSnapshot_Dates

#TableA次のような結果を与える

#TableA

ItemId  ItemName    ItemVer    Installed 01 Jan 12    Installed 07 Feb 12 
1       Name1       2          34                     33
2       Name2       9          56                     59
3       Name3       5          12                     26
.
.
.
500     Name500     3          98                     106

私の質問は

  1. 間違った方法でアプローチすることで、ここで悪夢を作り出していますか?
  2. ループしてから#tmpSnapshot_Datesデータを取得して次の列を作成するにはどうすればよいですか?私は常にカーソルを避けようとしますが、これは私がカーソルを使用する必要がある状況の1つですか?

追加する列が12個ある可能性があり、日付ごとにすべてのアイテムが返されるわけではありません。

4

2 に答える 2

1

確かにそれは良いことではありませんが、はい、カーソルを使用して繰り返し処理する必要があり#tmpSnapshot_Datesますが、オプションがある場合は、ピボットグリッドを作成する機能を備えたレポートソフトウェアを使用することをお勧めします。

于 2012-11-23T23:03:44.280 に答える
0

たとえば、ItemIdを参照する別の(temp?)テーブルを用意する方がよいのではないでしょうか。#TableA

InstalledDate    ItemId    Count
-------------    ------    -----
2012-01-01            1       34
2012-01-01            2       56
2012-01-01            3       12
.                     .        .
.                     .        .
.                     .        .
2012-01-01          500       98
2012-02-07            1       33
2012-02-07            2       59
2012-02-07            3       26
.                     .        .
.                     .        .
.                     .        .
2012-02-07          500      106
于 2012-11-21T15:47:49.000 に答える