按共同值对列中的项目进行分组,然后显示为百分比
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 当然,如果它对你有帮助,请接受/支持答案以上是关于按共同值对列中的项目进行分组,然后显示为百分比的主要内容,如果未能解决你的问题,请参考以下文章