SELECT round(count(*) FILTER (WHERE answer) * 100.0 / count(*),2) AS pct_yes,round(count(*) FILTER (WHERE NOT answer) * 100.0 / count(*),2) AS pct_no
FROM fast_survey;
pct_yes | pct_no
--------+-------
80.00 | 20.00
db 提琴here
我乘以100.0
(不是 100
)以避免整数除法。结果是类型numeric
,可以将其输入round()
进行美化。参见:
假设answer
为boolean
。否则,请适应。
Postgres 9.4引入了聚合FILTER
子句。参见:
应该尽可能快。
,
您可以COUNT
在分区上获取每种答案类型的值:
SELECT DISTINCT answer,COUNT(*) OVER (partition BY answer) AS total,COUNT(*) OVER (partition BY answer) * 100 /
COUNT(*) OVER () AS percentage
FROM fast_survey
Demo on SQLFiddle
如果您要提高百分比精度(对于上述查询,它是整数除法),请将第一个COUNT
强制转换为FLOAT
:
SELECT DISTINCT answer,CAST(COUNT(*) OVER (partition BY answer) AS FLOAT) * 100 /
COUNT(*) OVER () AS percentage
FROM fast_survey
Demo on SQLFiddle
,
怎么样?
SELECT
t1.answer,t1.votes / t2.total_votes
FROM
(SELECT answer,count(*) AS votes FROM fast_survey GROUP BY answer) AS t1,(SELECT count(*) AS total_votes FROM fast_survey) AS t2
;
如果您的调查有多个答案,这也将起作用。
,
只需将其与您在其中查找所有记录的表连接即可,无需对答案进行除法并计算百分比...类似这样的事情
select answer,count(*) / max(totalCount) * 100 as total from fast_survey group by answer
left join (select count(*) FROM fast_survey as totalCount) as all on true
本文链接:https://www.f2er.com/2870020.html