Расчет SQL Server, как изменить?
Мы делаем следующий расчет сервера sql:
SELECT SUM(COALESCE(ceiling(xm.datapoints / 8) + 1, 1)
Проблема в том, что мы не всегда должны добавлять + 1 к значению потолка.
- Если
xm.datapoints % 8 > 0
тогда мы должны добавить + 1. - Если
xm.datapoints % 8 = 0
мы не должны добавлять + 1.
Так как же мы изменим наш запрос, так что + 1 только добавляется ix xm.datapoints % 8 > 0
?
Благодарю.
6 ответов
Я подозреваю что xm.datapoints
является целым числом, поэтому результат деления усекается. Попробуй это:
SELECT SUM(COALESCE(ceiling(xm.datapoints / 8.0), 0.0)))
или если вы хотите использовать только целочисленную арифметику:
SELECT SUM(COALESCE(1+(xm.datapoints-1)/8, 0))
В случае, если это связано с тем, чего вы хотите достичь: если вы хотите округлить ВНИЗ до ближайшего значения, кратного 8, вы можете использовать эту маленькую побитовую магию:
SELECT xm.datapoints & (~ 7)
Может быть, это помогает...
SELECT SUM(COALESCE(case when (xm.datapoints % 8 > 0)
then ceiling((xm.datapoints % 8) + 1)
when xm.datapoints % 8 = 0
ceiling(xm.datapoints % 8 end), 1)
SELECT SUM(COALESCE(CEILING(xm.datapoints / 8)
+ CASE WHEN xm.datapoints % 8 > 0 THEN 1
ELSE 0 END, 1))
Вам также понадобилась дополнительная закрывающая скобка, но это, вероятно, ошибка копирования и вставки.
Попробуй это
SELECT SUM(COALESCE(ceiling(xm.datapoints / 8) + (CASE WHEN xm.datapoints %8 = 0 THEN 1 ELSE 0 END), 1))
Вы могли бы лечить 0
как NULL
с NULLIF
:
SELECT COALESCE(CEILING(NULLIF(@xmdatapoints, 0) / 8) + 1, 1)