2017-08-24 15 views
1

tablixを使用してSQL Server Reporting Services 2012でグループの合計を平均化しようとしています。グループ合計の平均i Reporting Services 2012

しかし、応答がない...この質問をしてstruggelingされているのと同じ問題があるように思わ:SQL 2005 Reporting Services - Wrong Average Values

私のTablixのは、次のようになります。

+-------+---------+-----------+-----------+ 
|  |   | Product A | Product B | 
+-------+---------+-----------+-----------+ 
|  | Average |  ??? | ???  | 
|  |   |   |   | 
| Week1 |   |  550 | 175  | 
|  | Day 1 |  250 | 100  | 
|  | Day 2 |  200 | 50  | 
|  | Day 3 |  100 | 25  | 
|  |   |   |   | 
| Week2 |   |  600 | 240  | 
|  | Day 1 |  300 | 200  | 
|  | Day 2 |   | 30  | 
|  | Day 3 |   | 10  | 
+-------+---------+-----------+-----------+ 

平均のみを計算する必要があります週合計のために。私。製品Aの平均値は(550 + 600)/ 2 = 575でなければなりません。次のような平均的なルックスのため

マイ式:

=Avg(Fields!WeekTotal.Value) 

は、しかし、これは間違った結果を与える - 私の推測では、それはアカウントのaswellに日数を要するということでしょうか?

質問は時々私はWeekTotalは、SQL Serverのテーブルから来予測

私のデータセットになります。その場合には日数の販売を、持っていないので、次のデータが含まれ、難しくなります:

+---------+------+-----+-----------+----------+ 
| Product | Week | Day | WeekTotal | DayTotal | 
+---------+------+-----+-----------+----------+ 
| A  | 1 | 1 | 550  | 250  | 
| A  | 1 | 2 | 550  | 200  | 
| A  | 1 | 3 | 550  | 100  | 
| B  | 1 | 1 | 175  | 100  | 
| B  | 1 | 2 | 175  | 50  | 
| B  | 1 | 3 | 175  | 25  | 
| A  | 2 | 1 | 600  | 300  | 
| A  | 2 | 2 | 600  | NULL  | 
| A  | 2 | 3 | 600  | NULL  | 
| …  | … | … | …   | …  | 
+---------+------+-----+-----------+----------+ 

ご協力いただきましてありがとうございます。

答えて

3

単純にすべての詳細値を(日単位で)合計してから、一意の週数で除算することができます。このような何か...あなたのサンプルで

=Sum(Fields!DayTotal.Value)/CountDistinct(Fields!Week.Value) 

CountDistinct(Fields!Week.Value)2

を返します。これは、すべての

enter image description here

...あなたは、このようなレポートのデザイン何かのように単純マトリクスを前提としてい

式は平均を計算するための上記の式です。

私のサンプルデータには詳細がありますので、曜日と週ごとにグループ化していますのでご注意ください。あなたの場合は、1日ごとにグループ化する必要はありません(でも、それでも機能します)

また、週の合計を単純に合計することもできます。

OPのコメントに基づいてUPDATE:あなたは(私が以前考えられていたとして、常にその日の合計の単なる総和されていない)データで、実際の週の合計を使用する必要があるとして

我々はする必要がありますデータセットを編集し、そこで作業を少し行います。 以下はサンプルデータセットの生成に使用されるコードです。私は今、余分な列WeekTotalAverageを(私は、貧しい人々の名前を知っている!)を返す

DECLARE @t TABLE (Product varchar(1), [Week] int, [Day] int, WeekTotal int, DayTotal[int]) 
INSERT INTO @t                         
VALUES   
('A', 1, 1, 550, 250), 
('A', 1, 2, 550, 200), 
('A', 1, 3, 550, 100), 
('B', 1, 1, 175, 100), 
('B', 1, 2, 175, 50), 
('B', 1, 3, 175, 25), 
('A', 2, 1, 600, 300), 
('A', 2, 2, 600, NULL), 
('A', 2, 3, 600, NULL) 

SELECT 
    * 
    , CAST(WeekTotal as float)/COUNT(*) OVER(PARTITION BY Product, [Week]) as WeekTotalAverage 
FROM @t 

注意してください。これが行うことは、週当たりの製品/週当たりの平均を与えることであり、単に前の式の日合計をこのフィールドに置き換えることができます。データセットの出力は次のようになります。

Product Week Day WeekTotal DayTotal WeekTotalAverage 
A  1  1 550   250   183.333333333333 
A  1  2 550   200   183.333333333333 
A  1  3 550   100   183.333333333333 
A  2  1 600   300   200 
A  2  2 600   NULL  200 
A  2  3 600   NULL  200 
B  1  1 175   100   58.3333333333333 
B  1  2 175   50   58.3333333333333 
B  1  3 175   25   58.3333333333333 

私はこの列の結果を浮動小数点に変換しましたが、結果が繰り返されるときに数値の端数が失われてしまいます。したがってこの場合、製品Bの1週目は3つのエントリを持つので、週合計(165)をとり、3で割って58.33を繰り返します。

レポートデザインも少し変わります。それは今のように見えます。

enter image description here

週間の合計が今ちょうど[WeekTotal](以前はそれが[SUM(DayTotal)]であった)であり、平均のための式は、現在マトリックス中に..

=Sum(Fields!WeekTotalAverage.Value)/CountDistinct(Fields!Week.Value) 

である、2つの行グループがあり、第1のグループはWeekであり、第2のグループ(子グループ)はDayでグループ化されています。列グループはProductにグループ化されています。

+0

こんにちは。あなたの応答をありがとう。私はこれが正しい方法だと思うが、私は時々私はDayTotalを持っていないことを言及することを忘れて、WeekTotalが予測であることを意味する。 DayTotalの合計を取ると、WeekTotalsだけが存在する週のデータが欠落します。私はこれに私の質問を更新しました....これを解決する方法のアイデアはありますか?前もって感謝します! – Tiawy

+0

私は答えを更新しました(私は古い答えをあまりにもスクロールダウンしました) –

0

私の解決策は、レポートの詳細部分で使用されているレコードセットではなく、そのスコープからの平均をとって、週ごとの週エントリを1つだけ持つ2番目のレコードセットを作成することです。

関連する問題