当初、顧客向けの MVC 3 (EF4) プロジェクトの一環としていくつかのレポートを手動で作成した後、Microsoft レポート サービス (SQL Server 2008 上の SSRS 2008) でレポートを作成する方がはるかに簡単であると判断しました。私のレポートのほとんどで、これは簡単であることが証明されており、ほとんどのレポートで SQL proc を記述する必要さえありません (モデルに基づく BIDS のセマンティック クエリ)。
ただし、1 つのレポートは、入力パラメーターの性質上、元は LINQ クエリではなくリストを返す関数で計算されているため、困難なままです。目標は、日付 a から日付 b までの範囲 (レポート要求者によって入力された変数) の任意の日に x パーセント未満の忙しさである人物テーブル内のすべての人を返すことです。このビジー レベル情報は、担当者、ジョブの開始日と終了日、およびそのタスク レベルに関する情報を含むジョブ テーブルにのみ存在します。その結果、私の元の C# 関数は、ほとんど次のことを行います (疑似コード)。
given startDateRange a, stopDateRange b, busyLevel x
{
for each person in people:
List returnPeople = new List()
create array consisting of days from a to b
for each job in jobs:
for each intersecting date of DateRange and job dateRange:
add task level of job to array
for each day in array:
if array[day] < x
returnPeople.Add(person)
break;
return returnPeople
}
関連する部分のテーブル構造:
People Table:
-PersonID (PK)
-other stuff...
Jobs Table:
-JobID (PK)
-StartDate
-StopDate
-Allocation
-AssignedPersonID (FK to People Table)
ご覧のとおり、そのジョブの AssignedPersonID が = that someone である場合、そのジョブは誰かのスケジュールに従っています
だから...私は現在SSRS 2008で作業しているので、同じ入力パラメーターからSSRSでこれらの同じ結果を取得する方法についてのガイダンスを探しています。私が現在気付いていないセマンティッククエリのトリックはありますか? 一時テーブルまたはテーブル変数を使用したSQLストアドプロシージャ? ある種のデータ処理拡張機能ですか? この種の問題への最善のアプローチについての情報は大歓迎です。
追加情報/コードが必要な場合はお知らせください。
編集:現在、カーソルと一時テーブルを使用して、元の関数の構造をほぼコピーするソリューションに取り組んでいます。これは間違いなく理想的ではありませんが、カーソルの複雑さと非効率的な性質のため、アドバイス/代替手段が役立ちます.
編集:解決策が見つかりましたが、間違いなく最も効率的ではありません。誰かが非常に高速な方法を持っている場合、受け入れられた回答を変更します。