De DBF a SQL (6). Agrupando filas

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 (18). Paginación

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