代码之家  ›  专栏  ›  技术社区  ›  elbarna

Postgresql:如何正确计算百分比?

  •  0
  • elbarna  · 技术社区  · 4 年前

    从我的数据库。

    select genre,count(*) from titles group by genre order by count desc;
         genre       | count 
    -----------------+-------
     Drama           |   529
     Comic           |   393
     Martial arts    |   276
     History         |   269
     Action          |   237
    

    我的问题是:如何获得百分比? 我想要这样的东西

    select ??????;
         genre       | percentage 
    -----------------+-------
     Drama           |   30%
     Comic           |   20%
     Martial arts    |   20%
     History         |   15%
     Action          |   11%
     Other           |   4%
    

    在询问之前,我已经尝试了很多从gogle和stackexchange获取的代码,正如您从psql历史中看到的那样 但所有的失败都是错误的或非常奇怪的结果。

    SELECT
        title,
        ROUND( AVG( genre ), 2 ) percentage
    FROM
        titles
    INNER JOIN genre
            USING(id_genre)
    GROUP BY
        title
    ORDER BY
        genre DESC;
    
    
    select title, round ( AVG( genre ), 2 ) percentage from titles;
    
    
    SELECT round((count(genre) *100)::numeric / NULLIF(count(*), 0), 2) AS percentage;
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   Gordon Linoff    4 年前

    使用窗口函数:

    select genre,
           count(*) as cnt,
           count(*) * 1.0 / sum(count(*)) over ()
    from titles
    group by genre
    order by cnt desc
    
        2
  •  0
  •   elbarna    4 年前

    感谢Gordon的正确答案,使用这个字符串我得到了一个完美的结果(除了0%的结果是0.0001。。。四舍五入,但不是问题)

    select genre, count(*) as total, round(count(*) * 100 / sum(count(*)) over ()) || ' %' as percent from titles group by genre order by total desc;
    
         genre       | total  | percent 
    -----------------+--------+-------------
     Drama           |    529 | 17 %
     Comic           |    393 | 13 %
     Martial arts    |    276 | 9 %
     History         |    269 | 9 %
     Action          |    237 | 8 %