Я работаю над проектом SQL-сервера для преобразования двух типов цен на автомобили (например, x - исходная цена, y - запрашиваемая цена дилера) на основе некоторых правил, так что для каждой заданной запрашиваемой цены дилера y я могу получите соответствующую первоначальную цену x. У меня возникают проблемы с правилом преобразования: x + 5 * потолок (x / 100) + некоторая константа c = y, x =?

(На самом деле это скорее математическая проблема. Например, если правило настолько простое, как x + 10 = y, тогда x = y-10.)

2
Esther Gao 2 Сен 2020 в 23:42

2 ответа

Лучший ответ

Действительно, это математическая задача, которую следует задать на Mathematics Stack Exchange.

Тем не менее, обратите внимание, что в уравнении x + ceil (x) + c = y, x и y-c отличаются только целым числом (которое зависит от x). А поскольку x + ceil (x) - возрастающая функция от x, то решение, которое существует, уникально.

Еще одно замечание:

  • для x из (0,1], x + ceil (x) лежит в (1,2].
  • для x из (1,2] x + ceil (x) лежит в (3,4].
  • ...

То есть есть решение, только если y-c находится в (2n-1,2n] для некоторого целого n. И тогда x = y-c-n.

Как мы находим n? Итак, y-c в (2n-1,2n] тогда и только тогда, когда (y-c) / 2 in (n-1/2, n]. Итак, мы должны иметь n = ceil ((y-c) / 2).


Это не намного сложнее для уравнения x + 5ceil (x / 100) = y-c.

В настоящее время,

  • для x в (0,100], x + 5ceil (x / 100) в (5,105]
  • для x в (100,200], x + 5ceil (x / 100) в (110,210]
  • ...
  • для x в (100 (n-1), 100n], x + 5ceil (x / 100) in (105n-100,105n]

Опять же, некоторые значения недостижимы, и если есть решение, оно уникальное. И если y-c лежит в (105n-100,105n] для некоторого n, то x = y-c-5n.

Конечно, вы хотите найти. Обратите внимание, что yc in (105n-100,105n] iff (yc) / 105 находится в (n-100/105, n], которое является подмножеством (n-1, n]). Поэтому, если есть решение, вы должны имеем n = ceil ((yc) / 105).

1
Jean-Claude Arbaut 3 Сен 2020 в 05:27

Не полный ответ, но для простого случая Y = X + Ceiling (X)

declare @X float = 3.7
declare @Y float = 0.0
SELECT @y = @x + ceiling(@x)


SELECT CASE 
            WHEN (@y -floor(@y)) = 0 THEN @y/2
            ELSE            (@y - (@y -floor(@y)) - 1)/2 + (@y -floor(@y)) 
        END XValue

Это работает для всех значений X, которые я тестировал. Первый случай - когда X - целое число.

< Сильный > ИЗМЕНИТЬ

Для вашего случая Y = X + 5 * CEILING (X) / 100 мы можем предположить, что если X является целым числом, то Y = X + 5/100 * X => 1.05 * X, если X не является целым числом, то y = Х + 5/100 (Х + 1) => 1,05 * Х + 0,05

Поэтому я думаю, что в вашем случае работает следующее:

declare @X float = 3.1
declare @Y float = 0.0
SELECT @y = @x + 5*ceiling(@X)/100


SELECT CASE WHEN (ROUND(@y/1.05,0) = @y/1.05) THEN @y / 1.05
        ELSE ROUND((@y - 0.05) / 1.05,2) END

В вашем случае с константой я не вижу, как решить эту проблему, не зная константы.

0
Steve Ford 2 Сен 2020 в 21:50