Datos agrupados en MySQL.

Resumen.

En este artículo vamos a realizar una de las tareas que mas nos va a ayudar a realizar un seguimiento de la evolución de nuestro sitio Web, las tablas de datos agrupados. Una tabla de datos agrupados es aquella que nos dice, por ejemplo, el número de hombres y mujeres que tenemos entre nuestros usuarios; el número de clientes que tenemos en las diferentes provincias; el número de artículos que tenemos de cada marca... Las posibilidades son muchísimas, y desde luego, muy interesantes.

Artículo.

Una tabla de datos agrupados es aquella que nos ofrece un resumen de los datos contenidos en una tabla según un cierto criterio, ¿no se acaba de entender? Pues esto es una tabla de datos agrupados.
Esta tabla la hemos generado desde nuestra tabla de datos de referencia, por el número de registros, es obvio que el número de registros es muy reducido, solo 9. Pero aún así nos sirve para ejemplificar lo que queremos decir, y nos disponemos a hacer.

Lo que hemos hecho ha sido un resumen de los usuarios registrados en función del sexo, que es la categoría, y cada uno de los valores (hombre y mujer), son los dos grupos que forman nuestra categoría.

Si hablásemos de una tienda online, las marcas de los artículos serian la categoría, y cada marca concreta seria el grupo donde tendríamos diferentes números de artículos.

Con esta aclaración hecha, vamos al asunto, el código desarrollado sobre la tabla de referencia seria el siguiente:
<?php  // Lectura de una tabla MySQL con datos agrupados // ArtesaniaWeb.Es include('archivos/func_conexionBD.php'); $Conex_BD ConectaBD();     // Contamos todos los registros de la tabla     $_Regis_tbl "SELECT COUNT(id) AS Nregis FROM $tb1";     $N_regis mysqli_fetch_assoc(mysqli_query($Conex_BD$_Regis_tbl));         $Tot_regis $N_regis['Nregis'];              // Recuento de resultados por categoria o grupo $_Grupo_SQL "SELECT *, COUNT(id) AS Ngrup FROM $tb1 GROUP BY sexo"; $_Grupo mysqli_query($Conex_BD$_Grupo_SQL);      $Tot_cat mysqli_num_rows($_Grupo);              echo '<div align="center">                 <table width="600">                     <tr>                         <td><b>Categoria</b></td>                         <td><b>Registros</b></td>                         <td><b>Porcentaje</b></td>                     </tr>'; while($registro mysqli_fetch_array($_Grupo)){                  // Imprimimos el nombre del sexo en lugar del valor guardado en la BD         if($registro['sexo'] == 1){             $sexo 'Hombre';         }else{             $sexo 'Mujer';         }     // Calculamos el porcentaje de cada grupo     $porcen round(($registro['Ngrup'] * 100) / $Tot_regis2);                              echo "<tr>                         <td>$sexo</td>                         <td>".$registro['Ngrup']."</td>                         <td>$porcen %</td>                     </tr>"; }                              echo "<tr>                         <td>Total Categ: <b>$Tot_cat</b></td>                         <td>Total Reg: <b>$Tot_regis</b></td>                     </tr>                 </table>             </div"; DesconectaBD($Conex_BD); ?>
Lo primero que hacemos es contar todos los registros de la tabla para, a partir de este dato, poder calcular el porcentaje de cada categoría. Este recuento lo hacemos con COUNT().

Seguidamente, con la variable $_Grupo_SQL hacemos la consulta para diferenciar cada valor dentro de un cierto campo, sexo en este caso. Esta consulta toma la siguiente forma:
$_Grupo_SQL = "SELECT *, COUNT(id) AS Ngrup FROM $tb1 GROUP BY sexo";
Esta consulta tiene 4 particularidades:

La primera “*,” que como ya dijimos, el * representa a todos los campos, pero en este caso, ya que COUNT le sigue, tenemos que poner una coma, si sustituyéramos el * por el nombre de los campos también tendría que terminar en coma “nombre,email,ip,”.

La segunda es COUNT() que unida a AS, ya la comentamos en este artículo, por lo que no entraremos en mas explicaciones.

La tercera es GROUP, que unida a BY es la sentencia que nos permite diferenciar cuantos valores diferentes hay guardados en una misma columna o campo.

La cuarta particularidad es que, si bien en otras consultas agregábamos un WHERE, tras el nombre de la tabla para establecer una condición, esto ahora no es posible, ahora debemos usar una nueva cláusula, HAVING, por lo que la consulta quedaría de la siguiente manera:
SELECT *, COUNT(*) Ngrup FROM $tb1 GROUP BY sexo HAVING COUNT(*) > 0
Con esta consulta, si en alguna de los grupos no hubiera al menos un registro, no aparecería en la tabla.

A estas particularidades hay que agregar una quinta, y es que dado que COUNT() crea un alias, Ngrup, no podemos usarlo para hacer un recuento de resultados, dado que el recuento queda condicionado por GROUP. Así que en este caso tenemos que hacer el recuento de categorías mediante mysqli_num_rows(), aunque esta sea menos eficiente que COUNT(), aún así, esto no suele ser problema, dado que las categorías suelen ser mucho mas limitadas que el número de registros.

Llegados a este punto, mediante “echo” imprimimos la cabecera de la tabla, y tras ella, inicializamos el bucle while. Dentro de este bucle, lo primero que encontramos es un condicional que nos va a permitir trasformar el sexo guardado como valores numéricos en la base de datos, en su forma textual (1 pasa a ser Hombre y 2 pasa a ser Mujer).

A continuación la variable $porcen, mediante una simple regla de 3 calcula el porcentaje de casos que pertenecen a cada grupo, y mediante la función round() lo redondeamos a dos decimales.

Seguidamente imprimimos los valores que contendrá la tabla y tras la finalización del bucle, agregamos una nueva línea a la tabla donde ponemos el número de categorías y el total de registros.

Y así finaliza este interesante código, con el cierre de la conexión a la base de datos.
Tags: Agrupado || GROUP || HAVING || mysqli_num_rows || COUNT

Comentarios.

Sin comentarios, publica el tuyo.