0

CompanyID、RevenueMonth、RevenueYear、Revenueを持つ各レコードのデータセットがあります

レポートを作成するとき、各 CompanyID をグループ化し、特定の年の月間収益を表示します。しかし、特定の年において、すべての企業が特定の月に収益を上げているわけではありません。

例:

サンプル レコードは次のようになります。

CompanyID、RevenueMonth、RevenueYear、Revenue
1,05,2013,5.00
1,08,2013,6.00
1,03,2013,3.00

最終結果、CompanyID 1 でレポートを次のようにしたいと思います。

会社ID|01|02|03|04|05|06|07|08|09|10|11|12
1 0.00|0.00|3.00|0.00|5.00|0.00|0.00|6.00|0.00|0.00|0.00|0.00

現在のレポートでは、3 月 (03)、5 月 (05)、および 8 月 (08) の列見出しのみを埋めます。

会社ID|03|05|08
1 3.00|5.00|6.00

年に欠落している月をレポートに追加するにはどうすればよいですか?

私の質問が明確であることを願っています。

4

1 に答える 1

2

データベース レベル

一度に 1 年しか返さないため、カレンダー テーブルを作成して、これを結果セットに追加できます。

CTE からの日付テーブルを使用して、できるだけ単純にします。

with months as -- get required year/months
(
  select RevenueYear = 2013
    , RevenueMonth = 1
  union all
  select RevenueYear = 2013
    , RevenueMonth = RevenueMonth + 1
  from months
  where RevenueMonth < 12
)
select CompanyID = coalesce(r.CompanyID, c.companyID)
  , RevenueMonth = coalesce(r.RevenueMonth, m.RevenueMonth)
  , RevenueYear = coalesce(r.RevenueYear, m.RevenueYear)
  , Revenue = isnull(r.Revenue, 0.0)
from months m
  cross join (select distinct CompanyID from records) c -- make sure all companies included
  left join records r on m.RevenueYear = r.RevenueYear
    and m.RevenueMonth = r.RevenueMonth

demo を使用した SQL Fiddle

これにより、結果セット内の各会社の年/月が返されます。

長期的には、CTE からデータベースの永続的なカレンダー テーブルに移行する方がよいでしょう。

次に、マトリックス スタイルの Tablix を使用して、これをレポートに実装できます。

レポートレベル

レポート レベルでこれを行いたい場合は、12 個の永続的な列 (各月に 1 列) を持つテーブル スタイルの Tablix を設定し、月の収益セルに次のような式を入力できます。

=Sum(IIf(Fields!RevenueMonth.Value = 2, Fields!Revenue.Value, Nothing)

2月のコラム。

これは、データベース コードを変更することなく、既存のデータセットで機能します。

于 2013-08-19T22:26:04.630 に答える