按共同值对列中的项目进行分组,然后显示为百分比

Posted

技术标签:

【中文标题】按共同值对列中的项目进行分组,然后显示为百分比【英文标题】:Group items in column by common value then display as a percentage 【发布时间】:2021-08-12 17:34:55 【问题描述】:

我有一张这样的桌子

id - type
1  - cat
2  - dog
3  - mouse
4  - cat
5  - cat
6  - cat
7  - mouse

我想要一个查询,它会产生这样的表

type  - total - percentage 
cat   - 4     - 57.14
dog   - 1     - 14.28
mouse - 2     - 28.57

我不能使用 OVER() 函数或 WINDOWS 函数。 我看过很多帖子,但没有一个查询对我有用。 我似乎无法弄清楚这一点。有什么想法/帮助吗??

【问题讨论】:

【参考方案1】:

您可以使用这样的查询:

SELECT
  (COUNT(*)/x.m)*100 AS percentage
  ,`type
FROM  yourTable
CROSS JOIN ( SELECT COUNT(*) as m from  yourTable ) x
GROUP BY `type`;

【讨论】:

【参考方案2】:

您可以聚合然后使用窗口函数来计算总体比率:

select type, count(*),
       count(*) * 100.0 / sum(count(*)) over () as percentage
from t
group by type;

以上要求 mysql 8+。在旧版本中,一种方法使用两种聚合:

select type, count(*),
       count(*) * 100.0 / x.total_cnt as percentage
from t cross join
     (select count(*) as total_cnt from t) x
group by type;

【讨论】:

对我不起作用,不能使用 over 功能 @LFED 为什么不呢?你用的是哪个版本的mysql? 我正在使用元数据库 v0.40.1 我看不到我使用的是哪个版本的 mysql,没有管理员权限 @LFED 你可以运行 select version(); 。但是当你说它不起作用时,更具体【参考方案3】:

如果你不想使用窗口功能:

select type, count(*),
       count(*) * 100.0 / (select count(*) from t) as percentage
from t
group by type; 

回答您的评论:

select case when type in ('cat','dog') then 'cat & dog' else type end, count(*),
       count(*) * 100.0 / x.total_cnt as percentage
from t
cross join (select count(*) as total_cnt from t) x
group by case when type in ('cat','dog') then 'cat & dog' else type end; 

【讨论】:

这成功了!感谢您的询问。如果可以的话,请跟进。如果我想把猫和狗放在一个桶里,把老鼠放在一个单独的桶里,我该怎么做?类似于下表``` type - total - percent cat/dog - 5 - 71.42 mouse - 2 - 28.57 ``` 感谢您的洞察!!非常感谢。您是否对我在此处发布的一个新问题有进一步的了解***.com/questions/68785377/filtering-a-joined-table @LFED 当然,如果它对你有帮助,请接受/支持答案

以上是关于按共同值对列中的项目进行分组,然后显示为百分比的主要内容,如果未能解决你的问题,请参考以下文章

按SQL Server中的总计百分比分组

SQL:按日期分组并对列中的值求和

来自有条件和无条件列的 SQL 查询分组的比率或百分比

高级 PDF NetSuite - 按通用字段值对项目表进行分组

Laravel 选择列,然后按日期对列值进行分组

百分位数分组表[重复]