#sql #sql-server #case
#sql #sql-сервер #case
Вопрос:
Мне трудно читать этот запрос. Мне нужно избавиться от всего, что связано с «ShowStandadrdCost», так что внешний регистр. Но, похоже, я не могу понять, какие именно строки нужно удалить.
(CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
THEN ISNULL(s.Standard_Cost, 0)
ELSE s.Actual_Cost
END
ELSE ISNULL(s.Standard_Cost, 0)
END (CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
THEN ISNULL(s.Standard_Cost, 0)
ELSE s.Actual_Cost
END
ELSE ISNULL(s.Standard_Cost, 0)
END ) Item_Cost_Per,
Весь запрос просто
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
THEN ISNULL(s.Standard_Cost, 0)
ELSE s.Actual_Cost
Что добавляется, я не могу сказать.
Комментарии:
1.
CASE
выражение, а не оператор.CASE
Выражение иCASE
оператор сильно отличаются, и SQL Server не поддерживает последнее.2. Не уверен, что я понимаю, о чем вы спрашиваете здесь, вы просто просите нас объяснить, что делает первый фрагмент запроса? Какие части вы понимаете или не понимаете?
3. Я понимаю, что суть запроса заключается в том, что если фактическая стоимость равна нулю, используйте стандартную стоимость (я думаю), но я не понимаю, что делают все эти операторы case.
4. Некоторые примеры данных также могут быть полезны.
5. Вот как я читаю запрос. Когда ShowStandCost равно null, затем используйте фактическую стоимость, если она не равна null, затем используйте стандартную стоимость. Когда значение show standard cost не равно null, используйте значение standard cost . И затем это умножает это число на два? (добавляя его к себе) Я прав?
Ответ №1:
Вероятно, так я бы написал выражение.
CASE WHEN ShowStandardCost <> 0 --Maybe (ShowStandardCost = 1)?
THEN ISNULL(s.Standard_Cost, 0)
ELSE --Show Actual Cost, unless it's zero or null.
--If so, show Standard_Cost unless it's null.
--Only show zero if both columns are zero or null.
COALESCE( NULLIF( s.Actual_Cost, 0), s.Standard_Cost, 0)
END * 2 --The CASE expression is just repeating itself.
Ответ №2:
попробуйте это, не уверен, хотите ли вы этого,
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0 THEN ISNULL(s.Standard_Cost, 0) ELSE s.Actual_Cost end Item_Cost_Per
Фактический запрос прокомментирован ниже,
/*(CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN */
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
THEN ISNULL(s.Standard_Cost, 0)
ELSE s.Actual_Cost
END
/* ELSE ISNULL(s.Standard_Cost, 0)
END (CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
THEN ISNULL(s.Standard_Cost, 0)
ELSE s.Actual_Cost
END
ELSE ISNULL(s.Standard_Cost, 0)
END ) */ Item_Cost_Per,
Ответ №3:
If ShowStandardCost = null Then
If Actual_Cost = null Then
If Standard_Cost = null Then 0 Else Standard_Cost
Else Actual_Cost
End
Затем оператор повторяется и добавляет это значение к самому себе. Я бы просто окружил первую часть скобками и добавил «* 2» в конце, если бы это был я.
(CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
THEN ISNULL(s.Standard_Cost, 0)
ELSE s.Actual_Cost
END
ELSE ISNULL(s.Standard_Cost, 0)
END) * 2