#sql-server
#sql-сервер
Вопрос:
Я рассчитываю амортизацию транспортных средств и должен получить значения предыдущего месяца, если они существуют.
Я написал оператор case в предложении where, чтобы узнать, существует ли значение. Если это так, то я хочу вычесть один месяц и использовать это значение для получения данных за предыдущие месяцы. Если он не существует, мне нужны данные за текущий месяц. Но это будет делать только одно или другое. Я не понимаю, где находится exists?
SELECT b.*
--this is month we want to compare (For example month 45)
FROM #changes AS a
--this has all the months (for example month 1-50)
INNER JOIN work.dbo.DepreciationSchedule AS b
ON b.VehicleID = a.VehicleID
--If the previous months value exists in table b (Ex month 44), then take take that months value otherwise take the current value of table a (Ex month 45)
WHERE b.Month = CASE
WHEN EXISTS(SELECT *
FROM #changes AS innerA
WHERE innerA.month = a.month - 1)
THEN a.Month - 1
ELSE a.Month
END
Комментарии:
1. Сообщите нам ваш фактический результат и ожидаемый результат.
2. В вашем операторе case вы проверяете только, где существует запись за тестируемый месяц, но вы не сопоставляете ее с транспортным средством, которого вы также не хотите
innerA.VehicleID = a.VehicleID
3. Я не уверен в этом, если у вас есть InnerA.month = a.month — 1 пример данных и ожидаемые результаты помогут. поскольку у вас могут быть данные за предыдущий месяц в A и текущем месяце в innera, это то, что вы хотите?
Ответ №1:
Я понял это. Мне пришлось изменить две вещи.
- Добавьте идентификатор транспортного средства в текущий подзапрос, чтобы убедиться, что мне нужны только эти транспортные средства во временной таблице
-
Измените таблицу подзапросов на график амортизации
Выберите b.* — это месяц, который мы хотим сравнить (например, месяц 45) из #changes Как a — в нем есть все месяцы (например, месяц 1-50) для внутреннего объединения work.dbo.DismissationSchedule как b в b.VehicleId = a.VehicleId — Если значение предыдущих месяцев существует втаблица b (например, месяц 44), затем берем значение месяца, в противном случае берем текущее значение таблицы a (например, месяц 45), где b.Month = Case, когда существует (выберите * Из work.dbo.DismissationSchedule как InnerA, где InnerA.month = a.month — 1 и InnerA.VehicleId= a.VehicleId) Затем.Месяц -1 Еще.Конец месяца