我有此数据表
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 |
有规则
我尝试使用:
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
以下是一个可能的解决方案。注意事项:
IF
语句(在SQL Server中)仅用于控制流,不适用于语句中的条件值。而是使用CASE
CASE
列。然后将其加入到原始表中,以允许我们应用更新。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;