4

私はSSRSレポートを持っています。それは次のようになります。このSSRSレポートをグループ化するにはどうすればよいですか?

enter image description here

その定義は次のようになります。あなたはそれがGにこれらの数字がグループ化された異なる列の数字のちょうど束だ見ることができるように

enter image description here

A、B、Cの順に表示されます。レポートの各行について、列D、E、F、Gは詳細データです。問題は、各グループ(A、B、Cでグループ化されていることを意味する)について、D & E列のすべての行が必要なことです。 F & Gのカラムでは、重複したくないです。たとえば、最初のグループの場合、列F & Gに重複があり、データ20,30が2回出現しています。私がしたいことは、このような何か(重複が前述のレポートの結果に比べて削除された注意してください)で、本質的に:

enter image description here

は黄色の背景でデータを見てみましょう、それは私が、重複を削除したい部分です。私はSSRSでこれを実装する方法を知らない。誰かが私に正しい方向を向けることを望みます。テスト中のレポートはhttps://www.dropbox.com/s/qxvloaeuj31m0mj/Report1.rdl?dl=1からダウンロードできます。このシンプルなレポートは、より複雑なレポートで遭遇した問題を切り分けるために作成されました。私はロジックを変更することはできませんし、これを実装する方法を見つけなければなりません。前もって感謝します。

+0

ロジックを変更することはできません。どのような論理を変えられないのですか?あなたの手はどこに縛られていますか? –

+0

@ R.Richards私は、レポートデータを生成するデータベース内のストアドプロシージャを変更できないことを意味します。私の質問で使用したレポートは、実際のレポートの単純化されたバージョンです。私は、黄色の背景部分を、サブレポートのパラメータとしてグルーピング列の値を使用するサブレポートにしようとしました。それは実際には機能しますが、サブレポートが各グループごとに実行されるため、パフォーマンスは受け入れられません。 –

+0

入手しました。典型的な、本当ですか?現在のストアドプロシージャの出力を一時テーブルに挿入し、レポートに出力する前にデータを処理する必要がありますか?可能?私はそれをしました。私はいつもそれが好きではないが、それは動作する。 –

答えて

3

これは私の行くところです。私はあなたが望むのは、あなたが質問に含めた最後のスクリーンショットのようなものだと仮定しています。

利用可能にしたRDLをプルダウンしました。ありがとう!このようなことをはるかに簡単にすることができます。

レポートのSQLはモックデータです。これは私たちが試みているものに適しています。私はあなたが今からデータを供給しているストアドプロシージャがあなたに何か似ていると仮定します。結果をテンポラリテーブルに取り込んでデータを変更/整形し、それをレポートに戻すことについてコメントしました。それが私の答えです。

RDLの更新されたSQLがここにありますが、簡潔にするためにいくつかの行が残っています。

SELECT * 
INTO #Report 
FROM (VALUES(1,4,1,1,10,20,30), 
(1,4,1,2,11,20,30), 
… 
(22,666,7,14,23,150,6) 
) AS t(A, B, C, D,E,F,G); 

SELECT A.A, A.B, A.C, A.D, A.E -- selecting columns A thru E 
FROM #Report A 

UNION ALL 

SELECT DISTINCT B.A, B.B, B.C, B.F, B.G -- union in columns F and G 
FROM #Report B 
ORDER BY 1, 2, 3 

DROP TABLE #Report 

これはすべて、実際にSELECT INTOを使用して元の結果を持つ一時表を作成することです。次に、私は結果を分割し、UNIONそれはすべて私がお互いの上に積み重ねる必要がある列だけで一緒に戻ってきます。また、重複を取り除きたい場合はDISTINCTを使用してください。

これを指定したRDLで使用するには、TablixからF列とG列を削除し、SQLをこれに置き換える必要があります。これはTablixがデザインモードのように見えるでしょう。

enter image description here

は今、あなたが変更することはできませんストアドプロシージャがあることを述べました。ストアドプロシージャの結果をテンポラリテーブルに取得するには、2つのことを行う必要があります。

まず、プロシージャの結果と同じ形の一時表を作成します。テーブルは実際に一時テーブルである必要はありません。それを非一時テーブルにして後でドロップすることもできます。そして、あなたがその一時テーブルにストアドプロシージャの結果を挿入

CREATE TABLE #Report (A int, B int, C int, D int, E int, F int, G int) 

:一時テーブルの場合、DDLは次のようになります。

INSERT INTO #Report 
EXEC usp_MyStoredProcedure 

そして、いや、あなたは不思議に思った場合には、ストアドプロシージャと簡単なSELECT INTOオプションはありません。 たくさんの方がいらっしゃいましたらありました。

これが最終的なやり方であれば、ここではレポートのSQLのようなものがあります。

CREATE TABLE #Report (A int, B int, C int, D int, E int, F int, G int); 

INSERT INTO #Report 
EXEC usp_MyStoredProcedure; 

SELECT A.A, A.B, A.C, A.D, A.E -- grabbing columns A thru E 
FROM #Report A 
UNION ALL 
SELECT DISTINCT B.A, B.B, B.C, B.F, B.G -- union in columns F and G 
FROM #Report B 
ORDER BY 1, 2, 3 

これは、レポートがプレビューモードでどのように見えるかです:

enter image description here

ホープこれはあなたを助けます。

2

SQLではなくSSRSベースのソリューションが必要な場合は、隣接のグループを使用して、後続の2つのデータセットを個別に制御できます。

  • 行グループで(Details)グループを右クリックし、Add Group > Adjacent After...を選択します。
  • 表示されるTablix Groupウィンドウで、グループ化するby [F]
  • 新しい(F)行グループを右クリックし、[Group Properties]に移動します。
  • 余分なグループ式を追加し、グループを[G]に追加します。 (グループの名前をFGに変更することもできます)。
  • レポートのFフィールドとGフィールドを新しい行(FGグループ内)に移動し、空の列を削除します。

詳細グループには、データセットのすべての行、つまりDとEのすべての行が表示されます.FGグループには、それぞれのA/B/Cグループ内でFとGの異なる組み合わせが1回ずつ表示されます。

Report1 preview with FG group added

関連する問題