我有两张桌子
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
但它不起作用,请告诉我,怎么办?
答案 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
nullif(X,0)
是一种干净的表达方式
返回X
,除非它等于0
,在这种情况下返回NULL
如果total
列为整数类型,请将TB_3.total
替换为TB_3.total::numeric(12,2)
(或其他任意精度)