Ya hemos visto como usar a las funciones agrupadas y su utilidad, pero hasta ahora involucraban a toda la tabla, completa. Ahora veremos algo mucho más útil: agrupando a las filas que tienen algo en común. Supongamos que tenemos esta tabla:
Captura 1. Las filas de la tabla VENTASCAB
Donde VTC_FECHAX es la fecha de la venta, VTC_CODCLI es el código del cliente, VTC_CODVEN es el código del vendedor, y VTC_TOTALX es el total vendido (no es correcta esta estructura, pero se la utiliza aquí por su facilidad de ser entendida).
Y ahora queremos saber el total vendido en cada día:
Captura 2. El total de ventas de cada día
Ahora nos interesa saber el total vendido a cada cliente
Captura 3. El total vendido a cada cliente
Ahora, queremos saber el total vendido por cada vendedor
Captura 4. El total vendido por cada vendedor
Ahora lo que nos interesa es conocer lo vendido en cada mes.
Captura 5. El total vendido en cada mes
Si has prestado atención, habrás notado que hay una diferencia en la cláusula GROUP BY. Mientras que en todos los ejemplos anteriores se escribía el nombre de una columna aquí se escribió un número. ¿Por qué eso? Porque el VFP no permite que se escriba una función después de la cláusula GROUP BY, pero siempre se puede escribir un número ahí si se desea. El número 1 indica que se agrupará por la primera columna.
También se puede agrupar por más de una columna.
Captura 6. Agrupando por dos columnas al mismo tiempo
En este caso además de la función agrupada SUM() también se escribió la función agrupada COUNT() ¿por qué eso? Para de un vistazo saber cuales códigos de cliente y códigos de vendedor se repiten y además la cantidad de veces que se repiten. Lo que nos dice la Captura 6. es que el vendedor 002 le hizo dos ventas al cliente 00009 y que el vendedor 003 le hizo tres ventas al cliente 00010. En todos los demás casos cada vendedor le hizo una sola venta a su cliente.
Y así como usamos a la función agrupada SUM() también podemos usar a cualquiera de las otras funciones agrupadas. Por ejemplo, si queremos saber el promedio de ventas de cada día podríamos escribir:
Captura 7. El promedio de ventas de cada día, el total vendido, y la cantidad de ventas realizadas en ese día.
Todas las columnas deben escribirse después de la cláusula GROUP BY
Un error que muchos principiantes cometen es escribir columnas después del SELECT pero no escribirlas después del GROUP BY.
Captura 8. Un error debido a que falta la columna VTC_CODVEN después de la cláusula GROUP BY
Como puedes ver en la Captura 8. después del SELECT se escribieron los nombres de dos columnas pero después del GROUP BY se escribió solamente el nombre de una columna. Eso, no tiene sentido y por eso el VFP se enoja. ¿Y por qué no tiene sentido? Porque la agrupación se hace por valores idénticos y la concatenación de dos columnas jamás será igual al valor que tiene una sola columna. En nuestro ejemplo, la concatenación de VTC_FECHAX y VTC_CODVEN jamás será igual a VTC_FECHAX solamente.
Claro que tú podrías pensar: ¿y por qué simplemente no le agrega la columna (o columnas) que faltan? No puede hacerlo porque el orden de las columnas en el SELECT puede ser distinto al orden de las columnas en el GROUP BY.
Captura 9. El orden de las columnas después del SELECT es distinto al orden de las columnas después del GROUP BY
Como ves en la Captura 9. el orden de las columnas en el SELECT es distinto al orden de las columnas en el GROUP BY. Eso es correcto, no hay problema ahí, se puede hacer si se desea. El requisito es que todas las columnas que aparecen en el SELECT también aparezcan en el GROUP BY, pero el orden en el cual aparecen puede ser muy distinto.
Las funciones agrupadas no deben escribirse después del GROUP BY
El VFP sabe muy bien lo que hacen las funciones agrupadas y por eso escribirlas en el GROUP BY es redundante y no está permitido. ¿Por qué no? Porque escribirlas ahí solamente podría prestarse a confusión pues ningún beneficio se obtendría. Por lo tanto, lo sabio es impedirte que escribas algo que ningún beneficio te puede dar y sí algunos problemas.
Conclusión:
Podemos agrupar las filas que tienen datos en común para ver un resumen de esos datos. No es obligatorio usar funciones agrupadas en tales casos aunque es muy común usarlas.
Muchos de los informes que los clientes te pedirán requerirán que les muestres datos agrupados. Con SQL es muy fácil realizar esa tarea, tal y como habrás visto en este artículo.
Artículos relacionados:
De DBF a SQL (1). Introducción
De DBF a SQL (2). Reemplazando comandos
De DBF a SQL (3). Entendiendo a los cursores
De DBF a SQL (4). Ejemplos de usar SELECT con una sola tabla
De DBF a SQL (5). Las funciones agrupadas
De DBF a SQL (7). Poniéndoles condiciones a los grupos
De DBF a SQL (8). Ordenando las filas
De DBF a SQL (9). Uniendo tablas
De DBF a SQL (10). Obteniendo las primeras filas de una tabla
De DBF a SQL (11). Relacionando una tabla con otra tabla
De DBF a SQL (12). Relacionando una tabla consigo misma
De DBF a SQL (13). Relacionando a varias tablas entre sí
De DBF a SQL (14). Más sobre el uso de DISTINCT
De DBF a SQL (15). Usando subconsultas
De DBF a SQL (16). Más sobre las subconsultas
De DBF a SQL (17). Ejemplos de subconsultas
De DBF a SQL (19). Hallando los porcentajes sobre un total
De DBF a SQL (20). Los operadores especiales de comparación
De DBF a SQL (21). La técnica de los dos cursores
De DBF a SQL (22). Optimizando el uso del operador de comparación especial IN
De DBF a SQL (23). Usando la función CAST()
De DBF a SQL (24). Buscando texto
De DBF a SQL (25). Creando tablas y cursores
De DBF a SQL (26). INSERT, UPDATE, y DELETE, con subconsultas
De DBF a SQL (27). Entendiendo Cliente/Servidor
De DBF a SQL (28). Conectándose a un Servidor
De DBF a SQL (29). Las cadenas de conexión ODBC a los motores SQL más populares
De DBF a SQL (30). Conectándose mediante ADO a las bases de datos
De DBF a SQL (31). Optimizando la escritura de los SELECT
De DBF a SQL (32). Mejorando la estética de los SELECT
De DBF a SQL (33). Usando la función SQLEXEC()
De DBF a SQL (34). Enviándole parámetros a la función SQLEXEC()
El índice del blog VFPavanzado