Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Формула для эмуляции IF(A>B)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
Есть значения A и B, каждое принимает значения в диапазоне от 1 до 7.
Нужно вычислить значение C.
C=A-B. Но если A>B, то C=A-B-7.

Что-то торможу, не соображу, как это одним выражением записать.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
28 апр 15, 12:03    [17574465]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Alibek B.,

Это в синтаксисе какого языка или СУБД нужно?
28 апр 15, 12:17    [17574607]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
В PL/SQL, из функций доступны MOD (остаток от деления), а также GREATEST (максимум) и LEAST (минимум).
28 апр 15, 12:31    [17574746]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Alibek B.
В PL/SQL
C := CASE A>B THEN A-B-7 ELSE A-B END;
28 апр 15, 12:38    [17574811]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Alibek B.,

WITH t AS
 (SELECT 1 f
    FROM dual
  UNION ALL
  SELECT 2 f
    FROM dual
  UNION ALL
  SELECT 3 f
    FROM dual
  UNION ALL
  SELECT 4 f
    FROM dual
  UNION ALL
  SELECT 5 f
    FROM dual
  UNION ALL
  SELECT 6 f
    FROM dual
  UNION ALL
  SELECT 7 f FROM dual)
SELECT a.f a,
       b.f b,
       CASE
         WHEN a.f > b.f THEN
          a.f - b.f - 7
         ELSE
          a.f - b.f
       END c1,
       MOD(a.f - b.f + 6, 7) - 6 c2
  FROM t a, t b
 ORDER BY a.f, b.f
28 апр 15, 12:43    [17574852]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
С IF и его разновидностями (DECODE, CASE) понятно.
Я имел ввиду, можно ли обойтись чисто арифметическими действиями.
В сочетании с MOD у меня получилась такая формула: C = mod((A - B) - 7, 7).
28 апр 15, 14:06    [17575503]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Alibek B.
Я имел ввиду, можно ли обойтись чисто арифметическими действиями.
Можно. В моем примере выше это уже есть.
28 апр 15, 14:08    [17575519]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
miksoft
MOD(a.f - b.f + 6, 7) - 6 c2

Да, оно, спасибо.
Правда я уже сам формулу подобрал.
28 апр 15, 14:08    [17575523]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Alibek B.
В сочетании с MOD у меня получилась такая формула: C = mod((A - B) - 7, 7).
Можно и так.
28 апр 15, 14:10    [17575535]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20763
Alibek B.
C=A-B. Но если A>B, то C=A-B-7

Так у тебя С всегда неположительно - ноль или отрицательное. Ты точно ЭТОГО хочешь?
28 апр 15, 15:06    [17576001]     Ответить | Цитировать Сообщить модератору
 Re: Формула для эмуляции IF(A>B)  [new]
Alibek B.
Member

Откуда:
Сообщений: 3721
Да. Фактически мне нужно определить начало недельного периода в виде сдвига в днях (началом может быть произвольный день недели).
Если текущий день недели больше начала (например период начинается со среды, а сегодня пятница), то сдвиг будет 3-5=-2.
Если текущий день больше меньше начала (например период начинается со среды, а сегодня понедельник), то сдвиг будет 3-1-7=-5.
Положительным сдвиг быть не может, только нулевым.
28 апр 15, 18:06    [17577258]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить