通过给定ID获取多行的比率

时间:2018-10-25 20:12:40

标签: postgresql

我有一个(测试)表:

  zip  | category | value 
-------+----------+-------
 17268 |        1 |    23
 17268 |        2 |    10
 17268 |        3 |    33
 10011 |        1 |    22
 10011 |        2 |    78
 10011 |        3 |    45

我想输出另一个表,该表按邮政编码显示类别3值所占总值的百分比。

例如,邮政编码17268的总值为66。对于该邮政编码类别3,其总值为33。因此,我想将输出比率值.5(对于33/66)分配给17268。

我可以运行以下命令:

select zip, sum(distinct value) from ziptest group by zip;

要获得这种转变:

  zip  | sum 
-------+-----
 10011 | 145
 17268 |  66

但是现在我想将每个邮政编码的总和除以该邮政编码的3类值。

有人可以建议吗?

我怀疑我正在寻找这样的东西:

select zip, (select value from ziptest where category = 3)/sum(distinct value) from ziptest group by zip;

或者这个:

select zip, sum(distinct value), (value where category = 3) from ziptest group by zip;

1 个答案:

答案 0 :(得分:2)

在这里,相关子查询是一条不错的路线。这与您的首次尝试类似,但是主查询和子查询之间具有“相关性”:

select zip, (select value from ziptest where category = 3 and zip = zt.zip)/sum(distinct value) 
from ziptest zt 
group by zip;

或者使用联接:

 select zt.zip, zt2.cat3value/sum(value)
 from ziptest zt
     INNER JOIN (SELECT DISTINCT zip, value FROM ziptest WHERE category=3) zt2
         ON zt.zip = zt2.zip
 group by zip;

或者(可能最快)正在使用case语句:

 SELECT zip, sum(CASE WHEN category=3 THEN value ELSE 0 END)/Sum(value)
 FROM ziptest
 GROUP BY zip;