2017-01-18 2 views
1

У меня есть отчет, который отображает месячные данные от начала проекта до текущего месяца для набора проектов. Когда проект не имеет данных в течение нескольких месяцев, он не отображается.Как заполнить данные за отсутствующие месяцы более 1 года

Мне нужно отобразить недостающие строки месяца для каждого проекта и показать 0 для этих строк.

Может быть создано 2 или более проектов (например, 100 проектов), для которых создается отчет. Начало проекта может быть из более ранних лет, например, 2014 год. Предположим, что текущий месяц - апрель 2016. Затем отчет должен отображать данные с 201401 по 20160 год. В приведенном ниже примере я использую месяц начала проекта как 201512.

Весь список месяцев хранится в таблице за месяц который содержит все месяцы. Начало проекта месяц (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 | 
====================================== 

набор данных возвращаемой выглядит так (позволяет называть ResultSet как 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 не хватает для проекта Нет 000123. для проекта Нет 000145, 201603 месяц отсутствует.

Ожидаемый выход как этот

===================================== 
|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 | 
====================================== 

Я пытался делать право присоединиться к ProjectReportData с таблицей месяцев, этого заполнит недостающие месяцы.

|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 | 
====================================== 

Но мне нужен ProjectNo также для заполнения вместо NULL.

Как я могу добиться этого. Пожалуйста, предложите.

+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 

Если вы не имеете таблицу Projects в базе данных:

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

Поместите перекрестное соединение в КТР:

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 
Смежные вопросы