我有一个(测试)表:
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;
答案 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;