Я хотел бы показать процент пола в каждой строке результата 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;

Этот запрос вернет результат для M & F, но я хотел бы, чтобы процент повторялся для каждой строки в таблице,

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

Как я могу это сделать ?

dbfiddle

1
Bisoux 7 Окт 2020 в 09:05

2 ответа

Лучший ответ

Нет необходимости в group by или каких-либо соединениях.
Используйте только оконную функцию COUNT():

select *, 
  round(100.0 * count(*) over (partition by gender) / count(*) over (), 2) percentage 
from Results 
order by employeeId

См. демонстрацию.
Полученные результаты:

> 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
2
forpas 7 Окт 2020 в 07:41

Я бы просто присоединился к подзапросу, который находит процентное соотношение для каждого пола:

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;

screen capture from demo link below

Демо

1
Tim Biegeleisen 7 Окт 2020 в 06:12