每行显示百分比
Showing Percentage on every row
我想在 sql 结果的每一行中显示性别百分比。我的数据如下:
CREATE TABLE Results
( employeeId varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
, Employee_Name varchar(228) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
, gender varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
, Citizenship varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into Results values
(1,'A','M','India'),
(2,'B','F','India'),
(4,'D','F','France'),
(3,'C','F','Lebanon'),
(5,'E','M','Sri Lanka');
通过使用
,按性别计算的百分比将为 M 40,F 60
select gender, round(count(gender) * 100/sum(count(gender)) over (),2) percentage
from Results
group
by gender;
此查询将 return M & F 的结果,但我希望对 table、
中的每一行重复百分比
employeeId EmployeeName gender Citizenship Percentage
1 A M India 40
2 B F India 60
4 D F France 60
3 C F Lebanon 60
5 E M Sri Lanka 40
我该怎么做?
我只想加入一个子查询,它可以找到每个性别的百分比:
SELECT
t1.employeeId,
t1.EmployeeName,
t1.gender,
t1.Citizenship,
t2.pct AS Percentage
FROM yourTable t1
INNER JOIN
(
SELECT gender, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS pct
FROM yourTable
GROUP BY gender
) t2
ON t1.gender = t2.gender;
不需要 group by
或任何连接。
仅使用 COUNT()
window 函数:
select *,
round(100.0 * count(*) over (partition by gender) / count(*) over (), 2) percentage
from Results
order by employeeId
参见demo。
结果:
> employeeId | Employee_Name | gender | Citizenship | percentage
> :--------- | :------------ | :----- | :---------- | ---------:
> 1 | A | M | India | 40.00
> 2 | B | F | India | 60.00
> 3 | C | F | Lebanon | 60.00
> 4 | D | F | France | 60.00
> 5 | E | M | Sri Lanka | 40.00
我想在 sql 结果的每一行中显示性别百分比。我的数据如下:
CREATE TABLE Results
( employeeId varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
, Employee_Name varchar(228) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
, gender varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
, Citizenship varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into Results values
(1,'A','M','India'),
(2,'B','F','India'),
(4,'D','F','France'),
(3,'C','F','Lebanon'),
(5,'E','M','Sri Lanka');
通过使用
,按性别计算的百分比将为 M 40,F 60select gender, round(count(gender) * 100/sum(count(gender)) over (),2) percentage
from Results
group
by gender;
此查询将 return M & F 的结果,但我希望对 table、
中的每一行重复百分比employeeId EmployeeName gender Citizenship Percentage
1 A M India 40
2 B F India 60
4 D F France 60
3 C F Lebanon 60
5 E M Sri Lanka 40
我该怎么做?
我只想加入一个子查询,它可以找到每个性别的百分比:
SELECT
t1.employeeId,
t1.EmployeeName,
t1.gender,
t1.Citizenship,
t2.pct AS Percentage
FROM yourTable t1
INNER JOIN
(
SELECT gender, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS pct
FROM yourTable
GROUP BY gender
) t2
ON t1.gender = t2.gender;
不需要 group by
或任何连接。
仅使用 COUNT()
window 函数:
select *,
round(100.0 * count(*) over (partition by gender) / count(*) over (), 2) percentage
from Results
order by employeeId
参见demo。
结果:
> employeeId | Employee_Name | gender | Citizenship | percentage
> :--------- | :------------ | :----- | :---------- | ---------:
> 1 | A | M | India | 40.00
> 2 | B | F | India | 60.00
> 3 | C | F | Lebanon | 60.00
> 4 | D | F | France | 60.00
> 5 | E | M | Sri Lanka | 40.00