Использование операторов Case с Not Exists как части предложения Where

#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:

Я понял это. Мне пришлось изменить две вещи.

  1. Добавьте идентификатор транспортного средства в текущий подзапрос, чтобы убедиться, что мне нужны только эти транспортные средства во временной таблице
  2. Измените таблицу подзапросов на график амортизации

    Выберите 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 Еще.Конец месяца