Далее следует возможное решение. Примечания:
- Пожалуйста, настройте все будущие SQL вопросы таким образом (т.е. создавайте образцы данных, готовые к использованию), так как вам будет гораздо проще ответить, и вы получите больше / быстрее помощи.
- Оператор
IF
(на сервере SQL) предназначен только для потока управления, а не для условных значений в операторах. Вместо этого используйте CASE
- Я предположил, что вы имели в виду 0,05 и 0,02 соответственно (в отличие от 0,5 и 0,2), поскольку это был единственный способ получить требуемые результаты.
- Обратите внимание на подзапрос, который позволяет нам использовать промежуточные результаты для вычисления столбца
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