Хранимая процедура без оператора CASE - PullRequest
3 голосов
/ 26 июля 2011

Моя проблема в том, что я хочу знать, как написать SQL-заявление, которое увеличит все счета с остатками более $ 10,0000 на 6%, все остальные учетные записи получают 5% (без использования оператора CASE) Таблица, включенная в выписку, представляет собой таблицу счетов со следующими полями: (account_number (PK), branch_name, balance).Заранее спасибо ...

Ответы [ 4 ]

6 голосов
/ 26 июля 2011

Просто для удовольствия, эта версия скрипта ypercube имеет только 1 обновление и должна выполнять эту работу:

UPDATE tableX
SET balance = balance * (1 + ((5.00 + convert(bit,floor(balance/10000))) / 100))

Примечание: я использовал 5.00 для принудительного деления на десятичные дроби, а не округлениякак инт.Вы также можете сделать это, сделав это правильно и преобразовав в десятичное число.

4 голосов
/ 26 июля 2011

Интересно, почему CASE нельзя использовать. В любом случае:

UPDATE tableX
SET  balance = balance * (1 + 0.06)
WHERE balance > 10000 ;

UPDATE tableX
SET  balance = balance * (1 + 0.05)
WHERE balance <= 10000
  AND balance > 0 ;

Возможно, вы хотите поместить это в транзакцию.


Без использования CASE и только с одним UPDATE:

UPDATE x
SET x.balance = x.balance * (1 + y.raise/100)
FROM tableX AS x
  JOIN
    ( SELECT 0 AS low, 10000 AS high, 5.0 AS raise
    UNION
      SELECT 10000, 9999999999, 6.0 
    ) AS y
    ON  x.balance > y.low 
    AND x.balance <= y.high

И еще один подход, просто для удовольствия:

UPDATE tableX AS x
SET balance = balance * 
  ( SELECT TOP 1
        change
    FROM 
      ( SELECT 0 AS low, 1.05 AS change
      UNION
        SELECT 10000,    1.06 
      ) AS y
    WHERE balance > low
    ORDER BY low DESC
  )
WHERE balance > 0 
3 голосов
/ 26 июля 2011

или этот запрос :)), но он гораздо тупее, чем запрос Джона.

update tableX a set ballance = 
                    (select  ballance*(1+6/100) as  ballance_new 
                    from tableX b
                    where ballance >=10000 and b.account_name = a.account_name 
                    union all
                    select ballance*(1+5/100) as  ballance_new c
                    from tableX
                    where ballance <10000 and c.account_name = a.account_name) 
1 голос
/ 26 июля 2011

Я думаю, что есть место для еще одного простого решения.Вот оно:

UPDATE @t
SET balance = (SELECT balance* 1.05 where balance <= 10000
         UNION SELECT balance* 1.06 where balance > 10000)

Пересмотрено @ AndriyM предлагает использовать UNION ALL вместо UNION для повышения производительности

UPDATE @t
SET balance = (SELECT balance* 1.05 where balance <= 10000
     UNION ALL SELECT balance* 1.06 where balance > 10000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...