5

SQL Server 2008 レポート サービスの使用:

相関データを表示するレポートを作成しようとしているので、 @table 変数を次のように使用することを考えました

DECLARE @Results TABLE (Number int
                       ,Name nvarchar(250)
                       ,Total1 money
                       ,Total2 money
                       )

insert into @Results(Number, Name, Total1)
select number, name, sum(total)
from table1
group by number, name

update @Results
set total2 = total
from
(select number, sum(total) from table2) s
where s.number = number

select from @results

ただし、Report Builder は、変数 @Results の値を入力するよう求め続けます。これはまったく可能ですか?

編集: KM が提案したように、ストアド プロシージャを使用して差し迫った問題を解決しましたが、元の質問はまだ残っています: レポート ビルダーで @table 変数を使用できますか?

4

7 に答える 7

6

いいえ。

ReportBuilderは

  1. 2番目はあなたを推測します
  2. @Resultsをパラメーターとして扱います
于 2010-08-04T19:48:10.123 に答える
3

そのすべてをストアドプロシージャに入れ、レポートビルダーにそのプロシージャを呼び出させます。処理する行が多い場合は、#tempテーブルを使用して(パフォーマンス的に)、Numberにクラスター化された主キーを作成する方がよい場合があります(または、サンプルコードがわからない場合はNumber + Nameになります)。

編集
あなたは1つのSELECTですべてを実行しようとし、それをレポートビルダーに送信することができます。これは最速である必要があります(一時テーブルなし):

select
    dt.number, dt.name, dt.total1, s.total2
    from (select
              number, name, sum(total) AS total1
              from table1
              group by number, name
         ) dt
        LEFT OUTER JOIN (select
                             number, sum(total) AS total2
                             from table2
                             GROUP BY number --<<OP code didn't have this, but is it needed??
                        ) s ON dt.number=s.number
于 2010-04-23T15:07:54.463 に答える
1

私のコードのように、SSRS データセット クエリでテーブル変数を使用できます。このコードでは、グループ フッターを固定位置に保持するために必要な「空の」レコードを追加しています (サンプルでは、​​pubs データベースを使用しています)。

DECLARE @NumberOfLines INT
DECLARE @RowsToProcess INT
DECLARE @CurrentRow INT
DECLARE @CurRow INT
DECLARE @cntMax INT
DECLARE @NumberOfRecords INT
DECLARE @SelectedType char(12)
DECLARE @varTable TABLE (# int、type char(12)、ord int)
DECLARE @table1 TABLE (type char(12), title varchar(80), ord int ) 
DECLARE @table2 TABLE (type char(12), title varchar(80), ord int )

@varTable に挿入 SELECT count(type) as '#', type, count(type) FROM titles GROUP BY type ORDER BY type @varTable から @cntMax = max(#) を選択

INSERT into @table1 (type, title, ord) SELECT type, N'', 1 FROM titles INSERT into @table2 (type, title, ord) SELECT type, title, 1 FROM titles

SET @CurrentRow = 0 SET @SelectedType = N'' SET @NumberOfLines = @RowsPerPage

SELECT @RowsToProcess = COUNT(*) from @varTable

WHILE @CurrentRow < @RowsToProcess BEGIN
SET @CurrentRow = @CurrentRow + 1

SELECT TOP 1 @NumberOfRecords = ord, @SelectedType = type FROM @varTable WHERE type > @SelectedType SET @CurRow = 0 WHILE @CurRow < (@NumberOfLines - @NumberOfRecords % @NumberOfLines) % @NumberOfLines BEGIN SET @CurRow = @CurRow + 1 INSERT into @table2 (type, title, ord) SELECT type, '' , 2 FROM @varTable WHERE type = @SelectedType END END SELECT type, title FROM @table2 ORDER BY type ASC, ord ASC, title ASC
于 2011-07-06T05:24:28.893 に答える
0

2つの結果セットをUNIONできないのはなぜですか?

于 2010-08-04T13:38:13.973 に答える
0

ストアド プロシージャではなく、テーブル値関数を使用するのはどうですか?

于 2010-08-04T23:01:33.333 に答える