动态构建报表的表

时间:2012-11-21 15:16:43

标签: sql sql-server sql-server-2008 tsql reporting

我有一个包含所有可用项目的临时表

#TableA

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

然后我有另一个保存快照与SnapshotId一起拍摄的所有日期

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然后获取数据以创建下一列?我总是试图避免使用游标,但这是我需要使用的一种情况吗?
  3. 可以添加12列,并且不会为每个日期返回每个项目。

2 个答案:

答案 0 :(得分:1)

肯定不会很好,但是是的,你需要使用游标并迭代#tmpSnapshot_Dates,但是如果你有选项,我建议你使用一个能够创建透视网格的报告软件

答案 1 :(得分:0)

ItemId中引用#TableA的单独(temp?)表会不会更好,例如:

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