Calcular porcentaje en MySQL
- Use una columna para calcular el porcentaje en MySQL
- Use dos columnas para calcular el porcentaje en MySQL
-
Utilice la función
OVER()
para calcular el porcentaje en MySQL
Calcularemos el porcentaje en MySQL usando una o varias columnas. Hay diferentes formas de hacerlo, y para cada enfoque, usaremos una tabla de muestra.
Use una columna para calcular el porcentaje en MySQL
Tenemos una tabla llamada “ventas” donde ID
, “Nombre del representante” y “Venta” son nombres de columna. Las siguientes consultas se pueden utilizar para crear y completar la tabla ventas
para practicar con este tutorial.
Código de ejemplo:
# create a table
CREATE TABLE sales (
ID INT NOT NULL,
RepresentativeName VARCHAR(45) NOT NULL,
Sale INT NOT NULL,
PRIMARY KEY (ID));
# insert data
INSERT INTO sales (ID, RepresentativeName, Sale) VALUES
(1, 'John', 15),
(2, 'Mehvish', 15),
(3, 'Saira', 30);
# display sales table data
SELECT * FROM sales;
Producción :
+----+--------------------+------+
| ID | RepresentativeName | Sale |
+----+--------------------+------+
| 1 | John | 15 |
| 2 | Mehvish | 15 |
| 3 | Saira | 30 |
+----+--------------------+------+
3 rows in set (0.00 sec)
Para encontrar el porcentaje del campo Venta
, podemos CROSS JOIN
la función SUM()
del atributo Venta
con la relación original (tabla). Consulte la siguiente consulta para hacerlo.
Código de ejemplo:
SELECT RepresentativeName, Sale,
round(((Sale * 100) / temp.SalesSum),2) AS Percentage
FROM sales
CROSS JOIN (SELECT SUM(Sale) AS SalesSum FROM sales) temp;
Producción :
+--------------------+------+------------+
| RepresentativeName | Sale | Percentage |
+--------------------+------+------------+
| John | 15 | 25.00 |
| Mehvish | 15 | 25.00 |
| Saira | 30 | 50.00 |
+--------------------+------+------------+
3 rows in set (0.00 sec)
Aquí, usamos el método round()
para obtener resultados con dos decimales. Si nos enfocamos en la consulta utilizada para encontrar el porcentaje, podemos ver que estamos usando la subconsulta después de la palabra clave CROSS JOIN
para encontrar la suma del atributo Venta
.
Use dos columnas para calcular el porcentaje en MySQL
Creamos una tabla llamada tests
con un ID
, GroupName
, EmployeesCount
y SurveysCount
como nombres de columna donde ID
es la CLAVE PRINCIPAL
. Use las siguientes consultas para moverse con nosotros a lo largo del tutorial.
Código de ejemplo:
# create a table
CREATE TABLE tests (
ID INT NOT NULL,
GroupName VARCHAR(45) NOT NULL,
EmployeesCount INT NOT NULL,
SurveysCount INT NOT NULL,
PRIMARY KEY (ID));
# insert data
INSERT INTO tests (ID, GroupName, EmployeesCount, SurveysCount) VALUES
(1, 'Group A', '200', '10'),
(2, 'Group B', '300', '200'),
(3, 'Group C', '400', '300');
# display tests table data
SELECT * FROM tests;
Producción :
+----+-----------+----------------+---------------+
| ID | GroupName | EmployeesCount | SurveysCount |
+----+-----------+----------------+---------------+
| 1 | Group A | 200 | 10 |
| 2 | Group B | 300 | 200 |
| 3 | Group C | 400 | 300 |
+----+-----------+----------------+---------------+
3 rows in set (0.00 sec)
Usamos la siguiente consulta para calcular el porcentaje usando los campos EmployeesCount
y SurveysCount
.
Código de ejemplo:
SELECT GroupName, EmployeesCount, SurveysCount, COUNT( SurveysCount ) AS testA,
concat(round(( SurveysCount/EmployeesCount * 100 ),2),'%') AS Percentage
FROM tests
GROUP BY EmployeesCount;
Producción :
+-----------+----------------+--------------+-------+------------+
| GroupName | EmployeesCount | SurveysCount | testA | Percentage |
+-----------+----------------+--------------+-------+------------+
| Group A | 200 | 10 | 1 | 5.00% |
| Group B | 300 | 200 | 1 | 66.67% |
| Group C | 400 | 300 | 1 | 75.00% |
+-----------+----------------+--------------+-------+------------+
3 rows in set (0.00 sec)
Calculamos el porcentaje dividiendo el SurveysCount
por EmployeesCount
y multiplicando por 100. Usamos la función round()
para redondearlo por dos decimales para que sea más legible.
Además, concatene con el símbolo %
usando la función concat()
para que sea fácil de entender.
Utilice la función OVER()
para calcular el porcentaje en MySQL
La función OVER()
es una de las Funciones de ventana en MySQL que calcula los valores sobre un cierto rango de valores. También podemos usar esta función para calcular porcentajes.
La función OVER()
es muy útil y nos ayuda a evitar las subconsultas para calcular porcentajes. Cree una tabla de productos
que tenga ProductID
, ProductName
y SupplierID
como nombres de atributos para comprender esta función.
Técnicamente, el SupplierID
debe ser una clave externa, pero lo estamos tomando como un campo simple solo para demostración. Utilice las siguientes consultas para crear la tabla de productos
e insertar datos.
Código de ejemplo:
CREATE TABLE products (
ProductID INT NOT NULL,
ProductName VARCHAR(45) NOT NULL,
SupplierID INT NOT NULL,
PRIMARY KEY (ProductID));
INSERT INTO products (ProductID, ProductName, SupplierID)
VALUES
(1,'Coca Cola', 2),
(2, 'Wavy Chips', 2),
(3, 'Dairy Milk Chocolate', 1),
(4, 'Parley Biscuits', 3),
(5, 'Knorr Nodles', 3),
(6, 'Snickers Chocolate', 3);
SELECT * FROM products;
Producción :
+-----------+----------------------+------------+
| ProductID | ProductName | SupplierID |
+-----------+----------------------+------------+
| 1 | Coca Cola | 2 |
| 2 | Wavy Chips | 2 |
| 3 | Dairy Milk Chocolate | 1 |
| 4 | Parley Biscuits | 3 |
| 5 | Knorr Nodles | 3 |
| 6 | Snickers Chocolate | 3 |
+-----------+----------------------+------------+
6 rows in set (0.00 sec)
Ahora, utilice la siguiente consulta para calcular el porcentaje de productos suministrados por cada proveedor. Usamos la función OVER()
en lugar de subconsultas para obtener la suma de los productos.
Código de ejemplo:
SELECT SupplierID AS Supplied_By, count(*) * 100.0 / sum(count(*)) Over() as 'Supplier Percentage'
FROM products
GROUP BY SupplierID;
Producción :
+-------------+---------------------+
| Supplied_By | Supplier Percentage |
+-------------+---------------------+
| 2 | 33.33333 |
| 1 | 16.66667 |
| 3 | 50.00000 |
+-------------+---------------------+
3 rows in set (0.09 sec)