按比例归并表格
按比例合并表格
现在有两个表格T1和T2,具有相同的格式,我需要把T2按照T1的内容,按比例合并到T1上。
比如T1,简化如下:
col _e col_p col_v
e1 p1 v1
e1 p2 v2
e2 p3 v3
e2 p4 v4
...
T2,简化如下
col_e col_p col_v
e1 p v5
e2 p v6
e3 p v7
当T1和T2有相同的col_e时,比如都有e1,需要取出T1中所有含有e1的行(第一行和第二行),算出这几行的col_v的值(v1、v2)在总值(v1+v2)中所占的比例,然后把T2中对应e1那一行的值(v5),按照这个比例分解然后合并上去。按比例分解得到:v5*v1/(v1+v2)和v5*v2/(v1+v2),合并上去得到v1+v5*v1/(v1+v2)和v2+v5*v2/(v1+v2)。
当T1不含有T2中的col_e时,比如T1不含有e3,就把T2中e3那一行(第三行)直接合并到T1上。
所以按照这个原则,结果表格T3应该是:
col_e col_p col_v
e1 p1 v1+v5*v1/(v1+v2)
e1 p2 v2+v5*v2/(v1+v2)
e2 p3 v3+v6*v3/(v3+v4)
e2 p4 v4+v6*v4/(v3+v4)
e3 p v7
请问大神们,这个script怎么写比较好?谢谢啦~
------解决思路----------------------
------解决思路----------------------
上面写错了,重新修改了一下,万分抱歉
现在有两个表格T1和T2,具有相同的格式,我需要把T2按照T1的内容,按比例合并到T1上。
比如T1,简化如下:
col _e col_p col_v
e1 p1 v1
e1 p2 v2
e2 p3 v3
e2 p4 v4
...
T2,简化如下
col_e col_p col_v
e1 p v5
e2 p v6
e3 p v7
当T1和T2有相同的col_e时,比如都有e1,需要取出T1中所有含有e1的行(第一行和第二行),算出这几行的col_v的值(v1、v2)在总值(v1+v2)中所占的比例,然后把T2中对应e1那一行的值(v5),按照这个比例分解然后合并上去。按比例分解得到:v5*v1/(v1+v2)和v5*v2/(v1+v2),合并上去得到v1+v5*v1/(v1+v2)和v2+v5*v2/(v1+v2)。
当T1不含有T2中的col_e时,比如T1不含有e3,就把T2中e3那一行(第三行)直接合并到T1上。
所以按照这个原则,结果表格T3应该是:
col_e col_p col_v
e1 p1 v1+v5*v1/(v1+v2)
e1 p2 v2+v5*v2/(v1+v2)
e2 p3 v3+v6*v3/(v3+v4)
e2 p4 v4+v6*v4/(v3+v4)
e3 p v7
请问大神们,这个script怎么写比较好?谢谢啦~
------解决思路----------------------
--先分配存在的
WITH s1 AS (
SELECT col_e, col_p, SUM(col_v) v
FROM t1
GROUP BY col_e, col_p
)
UPDATE t1
SET t1.col_v = t1.col_v + t2.col_v / s1.v
FROM t1, s1, t2
WHERE t1.col_e = s1.col_e AND t1.col_p = s1.col_p
AND t1.col_e = t2.col_e AND t1.col_p = t2.col_p
--再添加不存在的
INSERT INTO t1
SELECT *
FROM t2
WHERE NOT EXISTS (SELECT *
FROM t1
WHERE t1.col_e = t2.col_e AND t1.col_p = t2.col_p)
------解决思路----------------------
上面写错了,重新修改了一下,万分抱歉
with T1(col_e,col_p,col_v) as
(
select 'e1','p1','v1' union all
select 'e1','p2','v2' union all
select 'e2','p3','v3' union all
select 'e2','p4','v4'
),t2(col_e,col_p,col_v) as
(
select 'e1','p','v5' union all
select 'e2','p','v6' union all
select 'e3','p','v7'
)
select g.col_e,g.col_p,g.col_v+'+'+L.col_v+'*'+g.col_v+'/'+g.k as col_v from
(select *,
stuff((select '+'+a.col_v from t1 as a where a.col_e=t1.col_e for xml path(''))+')',1,1,'(') as k
from T1) as g left join t2 as L on g.col_e=L.col_e
union all select * from t2 where not exists(select * from t1 where t1.col_e=t2.col_e)