Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将查询中每个组的计数显示为百分比?_Sql_Postgresql_Aggregate Functions_Window Functions_To Char - Fatal编程技术网

Sql 如何将查询中每个组的计数显示为百分比?

Sql 如何将查询中每个组的计数显示为百分比?,sql,postgresql,aggregate-functions,window-functions,to-char,Sql,Postgresql,Aggregate Functions,Window Functions,To Char,我在我的桌子上有一个专栏,电影,演员。我试图得到每个演员出现的百分比 CREATE TABLE movies AS SELECT * FROM ( VALUES ('Robert DeSouza'), ('Tony Wagner'), ('Sean Cortese'), ('Robert DeSouza'), ('Robert DeSouza'), ('Tony Wagner'), ('Sean Cortese'), ('Charles Bastian'),

我在我的桌子上有一个专栏,电影,演员。我试图得到每个演员出现的百分比

CREATE TABLE movies AS SELECT * FROM ( VALUES
  ('Robert DeSouza'),
  ('Tony Wagner'),
  ('Sean Cortese'),
  ('Robert DeSouza'),
  ('Robert DeSouza'),
  ('Tony Wagner'),
  ('Sean Cortese'),
  ('Charles Bastian'),
  ('Robert DeSouza')
) AS t(actors);
我要求的结果是:

select Actors, (some formula * 100) as "The Ratio" from Movies

Actors                       The Ratio
Robert DeSouza                 44%
Tony Wagner                    22%
Sean Cortese                   22%
Charles Bastian                11%
                               100%
您可以使用。对于数值计算:

select m.actor,
       count(*) * 1.0 / sum(count(*)) over () as ratio
from movies m
group by m.actor;
您可以将比率转换为所需的任何格式-乘以100获得百分比,使用字符串串联添加百分比。对我来说,在这种情况下,所谓的比率应该在0和1之间

SELECT actors, floor(count(*) *100 / sum(count(*)) OVER ())
FROM movies
GROUP BY actors
ORDER BY count(*) DESC;
这会让你一路走到那里

     actors      | floor 
-----------------+-------
 Robert DeSouza  |    44
 Tony Wagner     |    22
 Sean Cortese    |    22
 Charles Bastian |    11
不确定你的例子中是如何得到100分的。你想要百分比的下限,你想要它神奇地说100?如果今天44+22+22+11=100,那么这只是其中的一天。但我们也可以这样做

SELECT actors AS "Actors", r::text || '%' AS "The Ratio"
FROM (
  SELECT
    actors AS "Actors",
    floor(count(*) *100 / sum(count(*)) OVER ()) AS r,
    false AS is_total
  FROM movies
  GROUP BY actors
  UNION ALL
    SELECT *
    FROM ( VALUES
      (null, 100, true)
    ) AS t(actors, floor, is_total)
  ORDER BY 3, 2 DESC
) AS t(actors,r);
产出

     Actors      | The Ratio 
-----------------+-----------
 Robert DeSouza  | 44%
 Tony Wagner     | 22%
 Sean Cortese    | 22%
 Charles Bastian | 11%
                 | 100%
如果您不想发言,您可以

没有包含百分号%字符的表达式,因此您的问题不能仅通过计算数值的表达式来解决。除了计算该值,还需要

此函数接受数值,并使用作为第二个参数提供的格式化文字将其转换为文本值。在这种情况下,您要做的似乎是四舍五入到最接近的百分比,并显示百分比符号。您可能希望使用“990%”作为格式化文字。将其添加到示例表中,将产生:

您希望确保您考虑到显示全部可能值的需要,包括100%和0%;由于to_char将四舍五入以满足您所需的精度,因此参与者可以显示零作为其比率,尽管表中存在:

[local] air@postgres=> delete from movies where actors <> 'Tony Wagner';
DELETE 7
Time: 36.697 ms
[local] ahuth@postgres=> insert into movies (actors) select 'Not Tony Wagner' from generate_series(1,500);
INSERT 0 500
Time: 149.022 ms
[local] ahuth@postgres=> select actors, to_char(100 * count(*) / sum(count(*)) over (), '990%') as "The Ratio" from movies group by actors;
┌─────────────────┬───────────┐
│     actors      │ The Ratio │
├─────────────────┼───────────┤
│ Tony Wagner     │    0%     │
│ Not Tony Wagner │  100%     │
└─────────────────┴───────────┘
(2 rows)

Time: 0.776 ms

如果要将其展开以显示小数位,只需修改格式字符串。如果要强制使用前导或尾随零,请在格式化文字中使用0。

这通过使用union将分组结果与整体结果连接起来来实现

编辑:删除了@Air注释后的连接和0

select actors actor, ratio from ( 
    select 0 sort
    , actors
    , round(count(*) * 100.0 / ( select count(*) 
    from movies ),0) ratio 
    from movies 
    group by actors 
    union 
    select 1 sort
    , 'Total'
    , round(count(*) / count(*) * 100,0) ratio 
    from movies 
) actors 
order by sort, actors ; 
-结果

      actor      | ratio 
-----------------+-------
 Charles Bastian | 11
 Robert DeSouza  | 44
 Sean Cortese    | 22
 Tony Wagner     | 22
 Total           | 100
(5 rows)

你应该使用*100.0而不是*1.0。我已经编辑了我的原始帖子。请看一下。@mcNets。我承认OP的值在0到100之间。但是这个列叫做ratio。我认为在这种情况下,比率应该在0和1之间。是的,你是对的,对不起。我只是想强调一下期望的结果。谢谢埃文,100%是罗伯特·德苏扎的4/9,所以44%。我希望能够以整体的形式显示百分比。@PLearner那么你想让它显示99?谢谢,我已经用你的建议编辑了原始帖子。我不知道为什么它仍然不等于100%。它只是将所有的值相加,得到9%。知道为什么会这样吗?它在空中起作用。。。它回答了这个问题。psql客户端中需要order by,我必须在底部获取总数。。。工会解决了取整问题。打字错误。。。如果100.00不是一个打字错误,那么我想知道你增加百分之一百数字的动机。就工作而言,当然,当我测试代码时,很多错误的查询在9行示例数据上工作得很好。。。我认为从四舍五入到2个百分点。。。不管采取什么样的观点。。。我来编辑。连接。。。你是认真的说托查会更好吗?您是否认为两个聚合查询的并集在某种程度上是一个糟糕/缓慢的查询?你今天过得不好还是一直这样?
      actor      | ratio 
-----------------+-------
 Charles Bastian | 11
 Robert DeSouza  | 44
 Sean Cortese    | 22
 Tony Wagner     | 22
 Total           | 100
(5 rows)