计算SQL Server中两个相似表列之间的比率

时间:2019-01-15 22:42:25

标签: sql sql-server sql-server-2012

我有这张桌子

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      ....

基本上是匹配行,然后执行第一表列/第二表列。

我有一个粗略的方法,就是使用将表连接到一个大表中,然后通过划分连接的列来创建另一个临时表,但我想知道是否有更好的方法。

谢谢

4 个答案:

答案 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