Mysql 正在获取“计数(*)占“分组依据”中所有项目数的百分比
比如说,我需要得到某个类别的可用项目数与所有项目数的比率。请考虑这样一个MySQL表:Mysql 正在获取“计数(*)占“分组依据”中所有项目数的百分比,mysql,Mysql,比如说,我需要得到某个类别的可用项目数与所有项目数的比率。请考虑这样一个MySQL表: /* mysql> select * from Item; +----+------------+----------+ | ID | Department | Category | +----+------------+----------+ | 1 | Popular | Rock | | 2 | Classical | Opera | | 3 | Popular
/*
mysql> select * from Item;
+----+------------+----------+
| ID | Department | Category |
+----+------------+----------+
| 1 | Popular | Rock |
| 2 | Classical | Opera |
| 3 | Popular | Jazz |
| 4 | Classical | Dance |
| 5 | Classical | General |
| 6 | Classical | Vocal |
| 7 | Popular | Blues |
| 8 | Popular | Jazz |
| 9 | Popular | Country |
| 10 | Popular | New Age |
| 11 | Popular | New Age |
| 12 | Classical | General |
| 13 | Classical | Dance |
| 14 | Classical | Opera |
| 15 | Popular | Blues |
| 16 | Popular | Blues |
+----+------------+----------+
16 rows in set (0.03 sec)
mysql> SELECT Category, COUNT(*) AS Total
-> FROM Item
-> WHERE Department='Popular'
-> GROUP BY Category;
+----------+-------+
| Category | Total |
+----------+-------+
| Blues | 3 |
| Country | 1 |
| Jazz | 2 |
| New Age | 2 |
| Rock | 1 |
+----------+-------+
5 rows in set (0.02 sec)
*/
我需要的基本上是一个类似于此的结果集:
/*
+----------+-------+-----------------------------+
| Category | Total | percentage to the all items | (Note that number of all available items is "9")
+----------+-------+-----------------------------+
| Blues | 3 | 33 | (3/9)*100
| Country | 1 | 11 | (1/9)*100
| Jazz | 2 | 22 | (2/9)*100
| New Age | 2 | 22 | (2/9)*100
| Rock | 1 | 11 | (1/9)*100
+----------+-------+-----------------------------+
5 rows in set (0.02 sec)
*/
如何在单个查询中实现这样的结果集
提前谢谢
SELECT Category, COUNT(*) AS Total , (COUNT(*) / (SELECT COUNT(*) FROM Item WHERE Department='Popular')) * 100 AS 'Percentage to all items',
FROM Item
WHERE Department='Popular'
GROUP BY Category;
我不确定MySql的语法,但您可以使用如图所示的子查询 这应该可以做到:
SELECT I.category AS category, COUNT(*) AS items, COUNT(*) / T.total * 100 AS percent
FROM Item as I,
(SELECT COUNT(*) AS total FROM Item WHERE Department='Popular') AS T
WHERE Department='Popular'
GROUP BY category;
这样做的一个优点是,您不必复制WHERE条件,这是一个定时炸弹,下次有人来更新条件时,它会滴答作响,但您没有意识到它在两个不同的地方
避免重复WHERE条件也可以提高可读性,特别是当WHERE因多个联接等而更复杂时。我不知道如何在查询中执行此操作,但为什么不在处理结果的代码中执行此操作呢?不幸的是,我需要在一个查询中执行此操作,以适应我的API。尽管如此,我还是在stackoverflow上发现了类似的问答。看到我下面的答案。是的,你是对的,我也发现了这个主题:看起来内部查询即使重复也不会花那么多时间,这要感谢MySQL优化等。非常感谢。这太完美了。为了得到一个百分比,不是应该颠倒分割吗?选择COUNT*FROM Item WHERE Department='Popular'/COUNT**100它可以工作,但我不喜欢重复WHERE子句您在FROM子句中缺少逗号,并且COUNT*Inline变量赋值没有列别名:=在Mysql 8中不推荐使用,将被删除
SET @total=0;
SELECT Category, count(*) as Count, count(*) / @total * 100 AS Percent FROM (
SELECT Category, @total := @total + 1
FROM Item
WHERE Department='Popular') temp
GROUP BY Category;