使用子查询中的if子句设置更新值

问题描述 投票:0回答:1

我有此数据表

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 |

有规则

  • 汽车=净* 0.5
  • 自行车=净* 0.2
  • 家庭=净* 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
sql-server tsql
1个回答
0
投票

以下是一个可能的解决方案。注意事项:

  1. 请以这种方式设置将来的任何SQL问题(即创建可供使用的示例数据),因为这样可以更轻松地回答问题,您将获得更多/更快的帮助。
  2. IF语句(在SQL Server中)仅用于控制流,不适用于语句中的条件值。而是使用CASE
  3. 我假设您的意思分别是0.05和0.02(而不是0.5和0.2),因为这是获得所需结果的唯一方法。
  4. 注意子查询,用于允许我们利用中间结果来计算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;
© www.soinside.com 2019 - 2024. All rights reserved.