У меня есть таблица с месячными значениями производства.
Пример:
Outdate | Prod Value | ID
2/28/19 | 110 | 4180
3/31/19 | 100 | 4180
4/30/19 | 90 | 4180
У меня также есть таблица с ежемесячными прогнозными значениями.
Пример:
Forecast End Date | Forecast Value | ID
2/28/19 | 120 | 4180
3/31/19 | 105 | 4180
4/30/19 | 80 | 4180
Я хочу создать таблицу, в которой есть строка, содержащая идентификатор, значение Prod Value, прогноз на текущий месяц (пример: март), прогноз на предыдущий месяц, прогноз на следующий месяц.
Что я хочу:
ID | Prod Value | Outdate | Current Forecast | Previous Forecast | Next Forecast
4180 | 100 | 3/31/19 | 105 | 120 | 80
Проблема в том, что когда я использовал DATEADD
, чтобы ввести конкретное значение из таблицы «Прогноз» за предыдущий месяц, случайные месяцы отсутствуют в моих окончательных значениях.
Я пытался добавить еще одну LEFT JOIN
/ INNER JOIN
с таблицей DateDimension при добавлении в прогноз на следующий месяц и предыдущий месяц, но это либо не решает проблему, либо добавляет слишком много строк.
Моя таблица DateDimension, в которой есть следующие столбцы: DateKey
Дата, День, DaySuffix, День недели, WeekDayName, IsWeekend, IsHoliday, DOWInMonth, DayOfYear, WeekOfMonth, WeekOfYear, ISOWeekOfYear, Месяц, MonthName, Квартал, QuarterName, Год, MMYYYY, Месяц, ГодDayFayOayOayDearOayOayOayDearOayOayDearOayOjOF FirstDayOfNextMonth, FirstDayOfNextYear
Мой запрос по этим направлениям (сокращенно для простоты)
SELECT A.ArchiveKey, BH.ID, d.[Date], BH.Outdate, BH.ProdValue, BH.Forecast, BHP.Forecast, BHN.Foreceast
FROM dbo.BudgetHistory bh
INNER JOIN dbo.DateDimension d ON bh.outdate = d.lastdayofmonth
INNER JOIN dbo.Archive a ON bh.ArchiveKey = a.ArchiveKey
LEFT JOIN dbo.BudgetHistory bhp ON bh.ID = bhp.ID AND bhp.outdate = DATEADD(m, - 1, bh.Outdate)
LEFT JOIN dbo.BudgetHistory bhn ON bh.ID = bhn.ID AND bhn.outdate = DATEADD(m, 1, bh.Outdate)
WHERE bh.ID IS NOT NULL
Я получаю что-то вроде этого:
+------+------------+---------+------------------+-------------------+---------------+
| ID | Prod Value | Outdate | Current Forecast | Previous Forecast | Next Forecast |
+------+------------+---------+------------------+-------------------+---------------+
| 4180 | 110 | 2/28/19 | 120 | NULL | NULL |
| 4180 | 100 | 3/31/19 | 105 | 120 | 80 |
| 4180 | 90 | 4/30/19 | 80 | NULL | NULL |
+------+------------+---------+------------------+-------------------+---------------+
И модель, похоже, не следует разумным.
Я хочу, чтобы значения были заполнены для каждой строки.