#sql-server
#sql-сервер
Вопрос:
У меня есть этот запрос
SELECT
TestPackageId,
SUM(ROUND((Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)) AS Shortage
FROM ...
Значение нехватки иногда отрицательное. Поэтому, если значение отрицательное, оно должно быть 0.
Как я могу это сделать?
Комментарии:
1. Почему вы не хотите использовать
CASE
выражение?2. @FelixPamittan должен ли я изменить свой основной код, если я изменю его на регистр?
3. Просто небольшое изменение:
SELECT TestPackageId, CASE WHEN SUM(ROUND((Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)) > 0 THEN SUM(ROUND((Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)) > 0 ELSE 0 END AS Shortage FROM ...
Ответ №1:
Выражение case — это правильный путь:
CASE WHEN SUM(ROUND((Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)) < 0 then 0 else SUM(ROUND((Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)) end
Комментарии:
1. Я хочу просто проверить эту часть, а не весь оператор суммы ROUND((Quantity — (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)
2. Какую часть вы хотите проверить? Ваш столбец нехватки — это сумма. Вам придется повторить это дважды, потому что нет способа использовать его как переменную без другого запроса.
3. Вы не можете использовать сумму, не равную сумме, без группировки по этому элементу
Ответ №2:
используйте формулу
(SUM(ROUND((
Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3))
ABS(SUM(ROUND((
Quantity - (QuantityBeforeDone QuantityExistInSite QuantitySpool TotalMIV)), 3)))) / 2
Ответ №3:
Вам необходимо использовать
Выражение Case
Вот пример:
case when value = 0 then 'zero' when value < 0 then 'negative' else 'positive' end
Ответ №4:
Для тех, кто предпочитает одну короткую строку вместо длинных операторов CASE или повторяющегося значения в ABS() (логика формулы может когда-нибудь измениться, и вам не нужно забывать менять ее везде в коде и т. Д.).
Используйте isnull(nullif(sign({column name}),-1),0)
:
select isnull(nullif(sign(-100),-1),0) as negative
select isnull(nullif(sign(0),-1),0) as zero
select isnull(nullif(sign(100),-1),0) as positive