Используйте условие if в подзапросе, чтобы установить значение для обновления - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть эта таблица данных

id | name |  Car  |  Bike  |
------------------------------------
1  | me   |   1   |    0   |
2  | you  |   0   |    1   |

И я хочу обновить ее в моей таблице tax с:

tax_id | name | net  |  Car | Bike | Home | Total |
---------------------------------------------------
   1   |  me  | 100  | NULL | NULL |  10  |   10  |
   2   |  you | 1000 | NULL | NULL |  100 |   100 |

до:

tax_id | name | net  | Car | Bike | Home | Total |
---------------------------------------------------
   1   |  me  | 100  |  5  |   0  |  10  |   15  |
   2   |  you | 1000 |  0  |   20 |  100 |   120 |

с правилами

  • автомобиль = net* 0,5
  • велосипед = net* 0,2
  • дом = net* 0,10
  • всего = машина + велосипед + дом

Я пытался использовать:

UPDATE tax
SET
    tax.Car = (
               IF (SELECT Car FROM DATA WHERE ID = 1) > 1
                   BEGIN
                       RETURN tax.net * 0.5
                   END 
               ),
     tax.Bike = (
               IF (SELECT Bike FROM DATA WHERE ID = 1) > 1
                   BEGIN
                       RETURN tax.net * 0.2
                   END 
               ),
WHERE ID = 1

1 Ответ

1 голос
/ 15 апреля 2020

Далее следует возможное решение. Примечания:

  1. Пожалуйста, настройте все будущие SQL вопросы таким образом (т.е. создавайте образцы данных, готовые к использованию), так как вам будет гораздо проще ответить, и вы получите больше / быстрее помощи.
  2. Оператор IF (на сервере SQL) предназначен только для потока управления, а не для условных значений в операторах. Вместо этого используйте CASE
  3. Я предположил, что вы имели в виду 0,05 и 0,02 соответственно (в отличие от 0,5 и 0,2), поскольку это был единственный способ получить требуемые результаты.
  4. Обратите внимание на подзапрос, который позволяет нам использовать промежуточные результаты для вычисления столбца Total. Который затем присоединяется к исходной таблице, чтобы мы могли применить обновления.
    declare @Test table (id int, [Name] varchar(32), Car bit, Bike bit);
    declare @Tax table (tax_id int, [Name] varchar(32), Net money, Car money, Bike money, Home money, Total money);

    insert into @Test (id, [Name], Car, Bike)
    values (1, 'me', 1, 0), (2, 'you', 0, 1);

    insert into @Tax (tax_id, [Name], Net, Car, Bike, Home, Total)
    values (1, 'me', 100, null,null, 10, 10), (2, 'you', 1000, null, null, 100, 100);

    --select * from @Test;
    --select * from @Tax;

    update T set
      Car = Y.Car
      , Bike = Y.Bike
      , Home = Y.Home
      , Total = Y.Total
    from @Tax T
    inner join (
    select tax_id, Car, Bike, Home,  Car + Bike + Home Total
      from (
        select tax_id
          , case when exists (select 1 from @Test T where T.id = tax_id and T.Car = 1) then Net else 0 end * 0.05 Car
          , case when exists (select 1 from @Test T where T.id = tax_id and T.Bike = 1) then Net else 0 end * 0.02 Bike
          , Net * 0.1 Home
        from @Tax
      ) X
    ) Y on Y.tax_id = T.tax_id;

    select * from @Tax;

Возвращает:

tax_id  Name    Net Car Bike    Home    Total
1   me  100.00  5.00    0.00    10.00   15.00
2   you 1000.00 0.00    20.00   100.00  120.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...