Мы уже несколько лет используем SQL, но требования изменились, и у меня возникла проблема с обновлением SQL.Нам нужно использовать другой оператор IN, основанный на OrderCompletedDate
.Если до 3/1/19, используйте в списке операторов IN, и если после, используйте другой.Я думал, что это был простой случай, когда, но не уверен сейчас.
Вот фрагмент кода:
SELECT
CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0) AS DATE) AS [MonthYear],
COUNT(ER.RegistrationID) AS TotalCounts
FROM
EventReg ER
WHERE
ER.OptedIn IS NOT NULL
AND (ER.Phone IS NOT NULL or ER.CellPhone IS NOT NULL)
AND (ER.BillingZip IN (CASE
WHEN ER.CreatedDateTime >= '3/1/2019 12:00 AM'
THEN '12345', '45678', '90123'
END)
OR ER.BillingZip NOT IN (CASE
WHEN ER.CreatedDateTime < '3/1/2019 12:00 AM'
THEN '07017', '07018', '07019'
END))
GROUP BY
DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0)
ORDER BY
DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0) ASC
Это явно не правильно, так как вы не можете иметь список предметов в случае / когда, как я выяснил.Я хотел обернуть CASE WHEN снаружи и затем выполнить весь запрос внутри каждого WHEN, но я просто продолжаю получать синтаксические ошибки.Пример:
AND (
CASE
WHEN ER.CreatedDateTime >= '3/1/2019 12:00 AM' THEN
ER.BillingZip IN (
'12345', '45678', '90123'
)
WHEN ER.CreatedDateTime < '3/1/2019 12:00 AM' THEN
ER.BillingZip NOT IN (
'07017', '07018', '07019'
)
END
)
Подход, вероятно, неправильный, но я не могу придумать, как обойти это, поскольку нам нужно сделать перерыв 3/1 без двух разных запросов, которых я стараюсь избегать.
Любая помощь будет принята с благодарностью!