我有这张桌子
Code1 Month1 Month2 Month3
--------------------------------
Delta 2000 3000 1000
Charlie 1000 1000 2000
Bravo 800 200 300
还有另一个类似的临时表,其中包含来自不同计算方面的数据
Code1 Month1 Month2 Month3
--------------------------------
Delta 1000 3000 3000
Charlie 300 400 200
Bravo 400 200 300
我想知道如何将两个表中的数据合并为以下格式
Code1 Month1 Month2 Month3
---------------------------------
Delta 2 ........
Charlie 3.3 ...
Bravo 2 ....
基本上是匹配行,然后执行第一表列/第二表列。
我有一个粗略的方法,就是使用将表连接到一个大表中,然后通过划分连接的列来创建另一个临时表,但我想知道是否有更好的方法。
谢谢
答案 0 :(得分:1)
您可以使用内部联接
select
t1.Code1,
(t1.month1 * 1.0) / t2.month1 as month1,
(t1.month2 * 1.0) / t2.month2 as month2,
(t1.month3 * 1.0) / t2.month3 as month3
from t1
inner join t2 on t1.code1 = t2.code1
请注意:
从提供的样本数据来看,似乎不需要完全外部联接。如果数据是1到1,则最好使用内部联接来考虑性能
答案 1 :(得分:1)
如果您具有所有匹配的行,那么inner join
很好。如果您关心不匹配的问题,我不会真的推荐full outer join
。相反,union all
提供了一种方法:
select code1,
sum(month1) / nullif(sum(month1_2), 0) as ratio_1,
sum(month2) / nullif(sum(month2_2), 0) as ratio_1,
sum(month3) / nullif(sum(month3_2), 0) as ratio_1,
from ((select t1.code1, month1, month2, month3
from t1
) union all
(select t2.code1, null, null, null, t2.month1 as month1_2, t2.month2 as month2_2, t2.month3 as month3_2
from t2
)
) t
group by code1;
答案 2 :(得分:0)
这是我根据此链接divide column from one table to column from another table
想到的SELECT ISNULL(T1.Code,T2.Code) AS Code
, CASE WHEN ISNULL(T1.Month1,0) = 0 THEN ISNULL(T2.Month1,0)
ELSE ISNULL(T2.Month1,0)/ISNULL(T1.Month1,0)
END AS Month1,
CASE WHEN ISNULL(T1.Month2,0) = 0 THEN ISNULL(T2.Month2,0)
ELSE ISNULL(T2.Month2,0)/ISNULL(T1.Month2,0)
END AS Month2,
CASE WHEN ISNULL(T1.Month3,0) = 0 THEN ISNULL(T2.Month3,0)
ELSE ISNULL(T2.Month3,0)/ISNULL(T1.Month3,0)
END AS Month3
FROM #TempBidCost AS T1
FULL JOIN #TempBidRevenue AS T2 ON T1.Code = T2.Code
答案 3 :(得分:0)
UNION合并行,因此这是您需要将一个表放到另一个表上,但又要彼此紧紧地连接堆栈列
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2