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按组划分的百分比[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用 R 中的多列按组计算百分比

Groupby 对象的百分比变化(按组)

ggplot barplot 按组给出百分比

使用 mutate_ 进行标准评估以按组计算百分比

有没有办法使用聚合命令按组计算不对称平均值(例如从百分位数 0.05 到 0.5)? R-工作室

按行组的百分比