我正在尝试在select语句中获得两列的商。这是我尝试过的。
Select ( select sum(x.amount) amount
from this_table x
where x.acct_no = '52'
) /
( select sum(x.amount) amount
from this_table x
where x.acct_no = '53'
) as amount
from this_table y
join this_table x on x.acct_no = y.acct_no
where x.acct_no = '52' or x.acct_no = '53'
当我这样做时,我的数量列只是1,我肯定不是结果应该是什么。有什么建议或帮助吗?溶液
答案 0 :(得分:1)
这应该按照你的意愿行事:
select sum(case when acct_no = '52' then amount else 0 end)
/ sum(case when acct_no = '53' then amount else 0 end) as amount
from this_table
where acct_no in ('52','53')
如果除数为零(而不是返回错误),则使金额列显示为零,您可以使用:
select case when sum(case when acct_no = '53' then amount else 0 end) = 0 then 0
else
sum(case when acct_no = '52' then amount else 0 end)
/ sum(case when acct_no = '53' then amount else 0 end) end as amount
from this_table
where acct_no in ('52','53')
如果您打算经常这样做和/或在您不希望向您抛出错误的应用程序中使用结果,那么这可能很有用。
答案 1 :(得分:1)
转换为数字
select 3 / 2;
?column?
----------
1
select 3::numeric / 2;
?column?
--------------------
1.5000000000000000
答案 2 :(得分:1)
这应该是你:
select ratio = sum(cast( case t.acct_no when '52' then t.amount else 0.00 end as numeric(15,2) )
/ sum(cast( case t.acct-no when '53' then t.amount else 0.00 end as numeric(15,2) )
from this_table t
where t.acct_no in ( '52' , '53' )
如果cast
是合适的数据类型,则可能不需要amount
。
答案 3 :(得分:1)
FWIW我刚刚在SQLFiddle http://sqlfiddle.com/#!1/d41d8/1606中玩了一个游戏,如果你只在一行单列结果之后,PostgreSQL似乎允许:
WITH Amounts52 as (select 23 as sum52),
Amounts53 as (select 4356 as sum53)
SELECT Amounts52.sum52::float
/ Amounts53.sum53 AS Result
FROM Amounts52, Amounts53
因此,您可以将Sum()
查询放在两个公用表格中,并获得单个结果 - 如果此方法对您有吸引力(它有其用途)
使用它(http://sqlfiddle.com/#!1/d41d8/1924/0)当然要简单得多:
SELECT (select 23 as sum52)
/(select 4356 as sum53)::float AS Answer
答案 4 :(得分:1)
基本陈述是:
SELECT
(SELECT sum(amount)::numeric FROM this_table WHERE acct_no = '52') /
(SELECT NULLIF(sum(amount), 0) FROM this_table WHERE acct_no = '53') AS div
NULLIF
会阻止division by 0
。在这种情况下,您得到NULL
,这是合适的结果。
如果amount
是某种整数,则转换为numeric type with more precision以保留小数位数。 (您可能需要round()
。)一次转换就足够了,结果是数据类型具有更高的精度。相关性取决于您的实际类型。
使用CASE
语句like @Brian provided的单个查询可能会更快。有了索引,这几乎不重要。
如果(acct_no)
(Postgres 9.2+)成为可能,那么(acct_no, amount)
上的索引会使这个速度更快,{{1}}上的多列索引更快。