Установите значение в 0, если оно меньше нуля в sql server

#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