Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算SQL Server中两个相似表列之间的比率_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

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

计算SQL Server中两个相似表列之间的比率,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有这张桌子 Code1 Month1 Month2 Month3 -------------------------------- Delta 2000 3000 1000 Charlie 1000 1000 2000 Bravo 800 200 300 我有另一个类似的temp表,其中包含来自不同计算方面的数据 Code1 Month1 Month2 Month3 ---------------

我有这张桌子

Code1   Month1   Month2   Month3 
--------------------------------
Delta    2000     3000     1000
Charlie  1000     1000     2000
Bravo     800      200      300
我有另一个类似的temp表,其中包含来自不同计算方面的数据

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      ....
这基本上是匹配行,然后执行第一个表列/第二个表列

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


谢谢

您可以使用内部连接

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,出于性能考虑,最好使用内部联接


如果您有所有匹配的行,那么
内部联接就可以了。如果您关心非匹配项,我不会真正推荐
完全外部连接。相反,
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;

UNION合并行,所以这就是您需要将一个表固定在另一个表上,但将堆栈、列和下一个列连接在一起的地方

SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2

您是只想选择这样的数据,还是想要一个这样的全新表?一个视图?假设
Code1
在每个表中都是唯一的,
JOIN
似乎是正确的方法。我只想选择数据并从存储的进程返回数据。看起来这个线程涵盖了我从示例数据中想要的内容,似乎不需要完全的外部连接(这样复杂)。如果数据是1对1,那么最好使用内部联接来考虑性能。我还建议您查找
ISNULL()
ISNULL
之间的差异,第二个将更适合您的查询。
/ISNULL(T1.Month1,0)
等——这可能会导致被零除。
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2