你如何划分选择陈述?

时间:2014-05-13 22:31:09

标签: sql postgresql

我正在尝试在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,我肯定不是结果应该是什么。有什么建议或帮助吗?溶液

5 个答案:

答案 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}}上的多列索引更快。