将列从一个表分隔到另一个表的列

时间:2017-02-12 15:40:34

标签: sql postgresql

我有两张桌子

    TB_1                      TB_3

Month     Total         Month        Total
2012-01     6          2012-01         12
2013-02     6          2013-02         12
2014-03     10         2014-03         20
2015-04     10         2015-04         20

在结果表中我需要遵循以下结果:

      RESULT_TB

Month        Total
2012-01       2
2013-02       2
2014-03       2
2015-04       2

我尝试了以下内容:

Select TB_3.total / TB_1.total 
From TB_3, TB_1

但它不起作用,请告诉我,怎么办?

4 个答案:

答案 0 :(得分:0)

试试这个:

select t1.month,
    case 
        when t1.total = 0
            then null
        else t2.total / t1.total
        end total
from tb_1 t1
join tb_3 t2 on t1.month = t2.month

我使用CASE来确保tb_1表中的总计为零,输出为NULL,而不是抛出除以零错误。

答案 1 :(得分:0)

您似乎只需要一个合适的JOIN条件:

Select t3.month, t3.total / t1.total 
From TB_3 t3 JOIN
     TB_1 t1
     ON t3.month = t1.month;

注意:如果表具有不同的月份集,那么您可能需要某种外部联接。

此外,当两个操作数都是整数时,Postgres会进行整数除法。目前还不清楚你是否想要这个。但如果值为“15”和“2”,那么结果将是“7”而不是“7.5”。

答案 2 :(得分:0)

您可以尝试以下代码:

     SELECT ISNULL(T1.Month,T2.Month) AS Month
          , CASE WHEN ISNULL(T1.Total,0) = 0 THEN ISNULL(T2.Total,0)
                 ELSE ISNULL(T2.Total,0)/ISNULL(T1.Total,0)
              END AS Total
       FROM TB_1 AS T1
  FULL JOIN TB_2 AS T2 ON T1.Month = T2.Month

我使用 FULL JOIN 来捕获两个表中的所有日期。我检查了所有NULL值,并用可分的值替换了NULL。

答案 3 :(得分:0)

仅限匹配月份,请使用此 -

select    TB_1.month                        as month
         ,TB_3.total / nullif(TB_1.total,0) as total

from            TB_1 
          join  TB_3 
          on    TB_3.month = TB_1.month

order by  month      

如果您还希望显示不匹配月份的结果,请使用此 -

select    coalesce(TB_1.month,TB_3.month)     as month
         ,TB_3.total / nullif(TB_1.total,0)   as total

from                  TB_1 
          full join   TB_3 
          on          TB_3.month = TB_1.month

order by  month      
  1. nullif(X,0)是一种干净的表达方式 返回X,除非它等于0,在这种情况下返回NULL

  2. 如果total列为整数类型,请将TB_3.total替换为TB_3.total::numeric(12,2)(或其他任意精度)