Расчет 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)

демонстрация

Другие вопросы по тегам