表名: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
请告诉我更新此问题的查询
答案 0 :(得分:0)
一种方法是在两个表之间执行CROSS JOIN(产生笛卡尔积),然后有选择地应用您想要的计算。
然后可以使用MAX()
-- 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
希望这会对你有所帮助