Mysql按组划分的百分比[关闭]
Posted
技术标签:
【中文标题】Mysql按组划分的百分比[关闭]【英文标题】:Mysql Percentage According to Group [closed] 【发布时间】:2021-01-21 12:32:24 【问题描述】:有一个像底部一样的桌子。
+-------+---------+----------+-------+
| type | ip | line | count |
+-------+---------+----------+-------+
| x | 1 | EN | 10 |
| x | 1 | FR | 10 |
| x | 2 | EN | 5 |
| x | 5 | EN | 5 |
| y | 3 | CH | 10 |
| y | 3 | PT | 10 |
| y | 4 | PT | 10 |
| y | 6 | EN | 10 |
+-------+---------+----------+-------+
我正在尝试根据内部类型的 ip 计算行的百分比。实际上计数不用于计算百分比,我只查看特定行的数量并将其除以总行数。所以,我希望看到这样的结果,我在桌子旁边举个例子。
+-------+---------+----------+
| line | type | percent |
+-------+---------+----------+
| EN | x | %100 |--> There are 3 EN and 3 ip inside the X, So 3/3=%100
| FR | x | %33 |
| CH | y | %33 |
| PT | y | %66 |
| EN | y | %33 |
+-------+---------+----------+
所以,我尝试了,但我无法在 sql 中达到该结果。
【问题讨论】:
请添加您尝试过的内容。group by line, type
可能是一个起点
你的主键是什么?
为什么主键在这种情况下很重要
如果你没有 PRIMARY KEY,那么你就没有真正的桌子。
【参考方案1】:
mysql 聚合函数在单个查询时只能使用一个分组。因此,您无法从原始数据中计算百分比,因为您需要 X 行的总行数和每行的行数并同时键入。
您可以做的是利用临时表,您将在其中执行第一次分组并计算每行的行数:
create temporary table test_total
select line, count(*) as total
from test
group by line
然后你可以在第二个查询中加入这个表:
select t.line, t.type, count(*), tt.total, round(count(*)/tt.total * 100,2)
from test t
join test_total as tt on tt.line = t.line
group by t.line, t.type
【讨论】:
或者在一个查询中完成所有操作【参考方案2】:考虑以下...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,line CHAR(2) NOT NULL
,type CHAR(1) NOT NULL
,ip INT NOT NULL
);
INSERT INTO my_table (line,type,ip) VALUES
('EN','x',1),
('FR','x',1),
('EN','x',2),
('EN','x',5),
('CH','y',3),
('PT','y',3),
('PT','y',4),
('EN','y',6);
SELECT line, type, COUNT(*) line_count FROM my_table GROUP BY line,type;
+------+------+------------+
| line | type | line_count |
+------+------+------------+
| CH | y | 1 |
| EN | x | 3 |
| EN | y | 1 |
| FR | x | 1 |
| PT | y | 2 |
+------+------+------------+
SELECT type, COUNT(DISTINCT ip) ip_count FROM my_table GROUP BY type;
+------+----------+
| type | ip_count |
+------+----------+
| x | 3 |
| y | 3 |
+------+----------+
然后结合以上...
SELECT a.line
, a.type
, a.line_count/b.ip_count * 100 pct
FROM
( SELECT line, type, COUNT(*) line_count FROM my_table GROUP BY line,type) a
JOIN
( SELECT type, COUNT(DISTINCT ip) ip_count FROM my_table GROUP BY type) b
ON b.type = a.type;
+------+------+----------+
| line | type | pct |
+------+------+----------+
| CH | y | 33.3333 |
| EN | x | 100.0000 |
| EN | y | 33.3333 |
| FR | x | 33.3333 |
| PT | y | 66.6667 |
+------+------+----------+
【讨论】:
以上是关于Mysql按组划分的百分比[关闭]的主要内容,如果未能解决你的问题,请参考以下文章