查找相对百分比

我进行了一次民意调查,结果来自用户的投票。例如:

您想要菲亚特吗?

id | answer
1    yes
2    no 
3    yes
...
25   no

count = 20 yes / 5 no

(20 * 100) /25 = 80% Yes
(5 * 100) /25 = 20% No

因此,80%的人想要菲亚特,20%的人不想要。显然我可以做类似的事情:

select answer,count(*) as total from fast_survey group by answer;

但是,这将显示计数,我正在寻找相对百分比。知道我该怎么做吗?

tiancai61 回答:查找相对百分比

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()进行美化。参见:

假设answerboolean。否则,请适应。

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

大家都在问