2017-01-18 4 views
1

プロジェクトの開始から現在の月までの月別データをプロジェクトセットに表示するレポートがあります。プロジェクトに数ヶ月間データがない場合、表示されません。1か月以上欠落しているデータを記入する方法

プロジェクトごとに欠落している月の行を表示し、それらの行に0を表示する必要があります。

レポートが生成されるプロジェクトは2つ以上あることがあります(100プロジェクトなど)。プロジェクトの開始は、2014年のような早い時期からでも可能です。現在の月は、私は数ヶ月のリストはヶテーブルに格納されているすべての201512.

として、プロジェクトの開始月を使用しています下のレポートには、例では201604.まで201401からのデータを表示する必要がある4月2016.Thenあるとし すべての月が含まれています。プロジェクト開始月(201512および現在の月201604をパラメータとのStoredProcedureに渡されます)

は現在のところ報告書は、この

===================================== 
|ProjectNo | Period | Billing | WIP | 
====================================== 
|00|201512 | 100  | 75 | 
|   |201601 | 200  | 100 | 
-------------------------------------- 
|000145 |201512 | 100  | 75 | 
|   |201601 | 200  | 100 | 
|   |201602 | 250  | 110 |  
|   |201604 | 550  | 110 | 
====================================== 

のように見えるのデータセットは、(ProjectReportDataとして結果セットを呼び出すことができます)このようなルックスを返さ

===================================== 
|ProjectNo | Period | Billing | WIP | 
====================================== 
|00|201512 | 100  | 75 | 
|00|201601 | 200  | 100 | 
|000145 |201512 | 100  | 75 | 
|000145 |201601 | 200  | 100 | 
|000145 |201602 | 250  | 110 |  
|000145 |201604 | 550  | 110 | 
====================================== 

あなたは201602,201603および201604プロジェクト番号000145のためのプロジェクトはありません000123. のために不足している見ることができるように、201603月が欠けています。

期待される出力が不足しているヶ月を記入します、私は数ヶ月テーブルでProjectReportDataに参加する権利をやってみました。この

===================================== 
|ProjectNo | Period | Billing | WIP | 
====================================== 
|00|201512 | 100  | 75 | 
|   |201601 | 200  | 100 | 
|   |201602 | 0  | 0 | 
|   |201603 | 0  | 0 | 
|   |201604 | 250  | 110 | 
-------------------------------------- 
|000145 |201512 | 100  | 75 | 
|   |201601 | 200  | 100 | 
|   |201602 | 250  | 110 | 
|   |201603 | 0  | 0 | 
|   |201604 | 550  | 110 | 
====================================== 

、 このようなものです。

|ProjectNo | Period | Billing | WIP | 
====================================== 
|00|201512 | 100  | 75 | 
|00|201601 | 200  | 100 | 
|NULL  |201602 | NULL  | NULL| 
|NULL  |201603 | NULL  | NULL| 
|NULL  |201604 | NULL  | NULL| 
|000145 |201512 | 100  | 75 | 
|000145 |201601 | 200  | 100 | 
|000145 |201602 | 250  | 110 | 
|NULL  |201603 | NULL  | NULL|  
|000145 |201604 | 550  | 110 | 
====================================== 

しかし、NULLの代わりにProjectNoを埋め込む必要があります。

これをどのように達成できますか。提案してください。

+1

どのdbmsを使用していますか? – jarlh

+0

あなたはあなたの右の参加を表示できますか? – MtwStark

+0

使用しているSQLを追加してください –

答えて

0

あなたは、データベース内のプロジェクトテーブルを持っている場合:

select ProjectNo, Period, IsNull(wip, 0) wip , IsNull(billing, 0) billing 
from Projects d1 
outer apply (
    select m.*,d2.wip, d2.billing 
    from Months m 
    left join ProjectReportData d2 on m.Period = d2.Period and d2.ProjectNo=d1.ProjectNo 
) mm 
order by 1, 2 desc 

あなたは、データベース内のプロジェクトテーブルを持っていない場合:

select ProjectNo, Period, IsNull(wip, 0) wip , IsNull(billing, 0) billing 
from (
    select distinct ProjectNo 
    from ProjectReportData 
) d1 
outer apply (
    select m.*,d2.wip, d2.billing 
    from Months m 
    left join ProjectReportData d2 on m.Period = d2.Period and d2.ProjectNo=d1.ProjectNo 
) mm 
order by 1, 2 desc 
+0

こんにちはMtwStark、ありがとうございました。それは動作します... – bharathy

+0

アップ票に十分なポイントがないので、私の投票は公開されません – bharathy

+0

あなたを歓迎して、嬉しいです。それが有用であると判明した場合は、回答を受け入れたものとしてマークしてください。 – MtwStark

0

CTEに参加クロスを入れて:

with Projects as 
(
select distinct ProjectNumber 
from ProjectReportData 
) 
, Periods as 
(
select p.ProjectNumber, c.Period 
from Projects p 
cross join CalendarTable c 
) 
select a.*, b.Billing, b.WIP 
from Periods a 
left join ProjectReportData b 
    on a.ProjectNumber = b.ProjectNumber 
関連する問題