SQL更新问题

时间:2014-11-12 10:04:03

标签: sql

表名:Hist_table

 Shp_cd wt_grp  net_wt  tot_wt
   101   10       9      7
   102   20       8      2
   103   15       4      1

Factor_table

Fact_id fact_column factor
  1     wt_grp        2
  2     net_wt        5
  3     tot_wt        3

注意 - 此因子表包含行作为hist_table的列名。

现在我们必须使用乘以因子

来更新Hist_table

例如,wt_grp因子是2,那么我们必须将hist表的所有wt_grp列更新为 Hist_table.wt_grp * factor_table.factor

所以结果应该是

shpcd   wt_grp  net_wt  tot_wt
101     20        45    21
102     40        40    6
103     30        20    3

请告诉我更新此问题的查询

2 个答案:

答案 0 :(得分:0)

一种方法是在两个表之间执行CROSS JOIN(产生笛卡尔积),然后有选择地应用您想要的计算。

然后可以使用MAX()

将每个shpcd的结果集减少到一行
-- sample data
    DECLARE @Hist TABLE (Shp_cd int, wt_grp int, net_wt int, tot_wt int)
    INSERT INTO @Hist (Shp_cd, wt_grp, net_wt, tot_wt) VALUES (101, 10, 9, 7)
    INSERT INTO @Hist (Shp_cd, wt_grp, net_wt, tot_wt) VALUES (102, 20, 8, 2)
    INSERT INTO @Hist (Shp_cd, wt_grp, net_wt, tot_wt) VALUES (103, 15, 4, 1)

    DECLARE @Factor TABLE (Fact_ID INT IDENTITY(1,1), fact_column varchar(6), factor int)
    INSERT INTO @Factor (fact_column, factor) VALUES ('wt_grp', 2)
    INSERT INTO @Factor (fact_column, factor) VALUES ('net_wt', 5)
    INSERT INTO @Factor (fact_column, factor) VALUES ('tot_wt', 3)

-- cross join to pick up factors
    SELECT 
        h.shp_cd,
        MAX(CASE WHEN f.fact_column = 'wt_grp' THEN wt_grp * factor END) AS wt_grp,
        MAX(CASE WHEN f.fact_column = 'net_wt' THEN net_wt * factor END) AS net_wt,
        MAX(CASE WHEN f.fact_column = 'tot_wt' THEN tot_wt * factor END) AS tot_wt
    FROM 
        @Hist h
         CROSS JOIN 
        @Factor f
    GROUP BY h.Shp_cd -- to bring it down to a single resultset

答案 1 :(得分:0)

您可以执行以下操作

-- update wt_grp
update h set h.wt_grp=h.wt_grp*f.factor
from Hist_table h,Factor_table f 
where f.fact_column='wt_grp'

-- update net_wt  
update h set h.net_wt=h.net_wt*f.factor
from Hist_table h,Factor_table f 
where f.fact_column='net_wt'

-- update tot_wt
update h set h.tot_wt=h.tot_wt*f.factor
from Hist_table h,Factor_table f 
where f.fact_column='tot_wt'


select * from Hist_table

这是一个有效的DEMO

希望这会对你有所帮助