У меня возникла небольшая проблема с логикой этого меняющегося измерения. Я хотел бы связать эти две таблицы ниже. Мне нужно сопоставить таблицу фактов «Стоимость — период» с измерением стоимости на основе идентификатора и даты вступления в силу.
Как видите, если поле месяца и года больше, чем дата вступления в силу связанного с ним измерения затрат, оно должно принять это значение. После того, как в измерение будет введена новая Дата вступления в силу, оно должно использовать это значение для любого периода, превышающего указанную дату в будущем.
РЕДАКТИРОВАНИЕ: приношу извинения за отсутствие подробностей, но измерение стоимости на самом деле будет иметь уникальное значение индекса, а изменяющиеся поля для ссылки на сопоставление будут Ресурс, Проект, Стоимость. Я попытался сопоставить запрос, который вы предоставили, с моими полями, но я получаю неверный результат.
К вашему сведению: изменение соглашения об именах: EngagementId — это Id, Resource — ConsultantId, а Project — ProjectId.
Я изменил изображения ниже, и вот мой запрос
,_cte(HoursWorked, HoursBilled, Month, Year, EngagementId, ConsultantId, ConsultantName, ProjectId, ProjectName, ProjectRetainer, RoleId, Role, Rate, ConsultantRetainer, Salary, amount, EffectiveDate)
as
(
select sum(t.Duration), 0, Month(t.StartDate), Year(t.StartDate), t.EngagementId, c.ConsultantId, c.ConsultantName, c.ProjectId, c.ProjectName, c.ProjectRetainer, c.RoleId, c.Role, c.Rate, c.ConsultantRetainer,
c.Salary, 0, c.EffectiveDate
from timesheet t
left join Engagement c on t.EngagementId = c.EngagementId and Month(c.EffectiveDate) = Month(t.EndDate) and Year(c.EffectiveDate) = Year(t.EndDate)
group by Month(t.StartDate), Year(t.StartDate), t.EngagementId, c.ConsultantName, c.ConsultantId, c.ProjectId, c.ProjectName, c.ProjectRetainer, c.RoleId, c.Role, c.Rate, c.ConsultantRetainer,
c.Salary, c.EffectiveDate
)
select * from _cte where EffectiveDate is not null
union
select _cte.HoursWorked, _cte.HoursBilled, _cte.Month, _cte.Year, _cte.EngagementId, _cte.ConsultantId, _cte.ConsultantName, _cte.ProjectId, _Cte.ProjectName, _cte.ProjectRetainer, _cte.RoleId, _cte.Role, sub.Rate, _cte.ConsultantRetainer,_cte.Salary, _cte.amount, sub.EffectiveDate
from _cte
outer apply (
select top 1 EffectiveDate, Rate
from Engagement e
where e.ConsultantId = _cte.ConsultantId and e.ProjectId = _cte.ProjectId and e.RoleId = _cte.RoleId
and Month(e.EffectiveDate) < _cte.Month and Year(e.EffectiveDate) < _cte.Year
order by EffectiveDate desc
) sub
where _cte.EffectiveDate is null
Пример:
Я изо всех сил пытаюсь написать запрос, который идет вместе с этим. Сначала я попытался разделить по наибольшей дате. Однако, когда я выполнил соединение, я получил самую высокую дату вступления в силу для каждого отдельного периода (даже тех, которые предшествуют дате вступления в силу).
Это то, что можно выполнить в запросе, или мне следует сосредоточиться на добавочных обновлениях целевой таблицы, чтобы любой эффективный период даты/времени в прошлом оставался в покое?
Любые советы были бы замечательными!
Спасибо, Ченнинг.