Como seguramente ya sabes, puedes usar la cláusula GROUP BY para agrupar filas de una tabla. Todo bien hasta ahí pero pronto descubrirás que a veces te encuentras con un problema … en tu SELECT solamente puedes ver las columnas que has agrupado.

Ejemplo: Tenemos una tabla llamada VENTASCAB (cabecera de ventas) que tiene los siguientes datos:

AGRUPAR1

Captura 1. Si haces clic en la imagen la verás más grande

Queremos ver sus columnas VTC_NRODOC, VTC_FECHAX, VTC_IDECLI y VTC_TOTALX pero solamente cuando la fecha está repetida. En otras palabras, si en una fecha se hicieron dos o más ventas queremos ver esas filas; si se hizo una sola venta, no queremos ver.

Listado 1. (no funcionará)

SELECT
   VTC_NRODOC,
   VTC_FECHAX,
   VTC_IDECLI,
   VTC_TOTALX
FROM
   VENTASCAB
GROUP BY
   VTC_NRODOC,
   VTC_FECHAX,
   VTC_IDECLI,
   VTC_TOTALX
HAVING
   COUNT(*) >= 2

Si ejecutamos el Listado 1. no obtendremos ni siquiera una fila. ¿Por qué no? porque estamos agrupando por VTC_NRODOC y el contenido de esa columna nunca se repite.

Listado 2. (no funcionará)

SELECT
   VTC_FECHAX
FROM
   VENTASCAB
GROUP BY
   VTC_FECHAX
HAVING
   COUNT(*) >= 2

Si ejecutamos el Listado 2. obtendremos la Captura 2. pero … no es lo que estamos necesitando.

AGRUPAR2

Captura 2. Si haces clic en la imagen la verás más grande

En la Captura 2. hemos agrupado por fechas que se repiten 2 ó más veces pero no podemos ver las columnas VTC_NRODOC, VTC_IDECLI, y VTC_TOTALX, y queremos verlas, entonces ¿cómo lo conseguimos?

Usando una gran construcción del Firebird que es la subconsulta filtrada. O sea, una subconsulta que se utiliza en la cláusula WHERE.

Listado 3. (Sí funcionará)

SELECT
   VTC_NRODOC,
   VTC_FECHAX,
   VTC_IDECLI,
   VTC_TOTALX
FROM
   VENTASCAB
WHERE
   VTC_FECHAX IN (SELECT
                     VTC_FECHAX
                  FROM
                     VENTASCAB
                  GROUP BY
                     VTC_FECHAX
                  HAVING
                     COUNT(*) >= 2)

Si ejecutamos el Listado 3. obtendremos la Captura 3. que nos mostrará exactamente lo que estábamos necesitando.

AGRUPAR3

Captura 3. Si haces clic en la imagen la verás más grande

O sea que si la fecha está repetida, queremos ver los datos de cada una de las ventas realizadas en esa fecha.

Si te fijas, notarás que la subconsulta del Listado 3. es igual a la consulta del Listado 2. ¿Qué estamos pidiendo en el Listado 3.? Que nos muestre las filas de la tabla VENTASCAB cuyas fechas se obtengan de la subconsulta. O sea, las fechas mostradas en la Captura 2. Por lo tanto, solamente si una fecha se encuentra en la Captura 2. esa fila será mostrada.

Conclusión:

Una subconsulta filtrada puede ser extremadamente útil en muchas circunstancias y debemos aprender a utilizarla. Lo que hacemos con ella es filtrar a una tabla o una vista para que solamente se utilicen las filas que cumplen con la condición que le imponemos.

Como en nuestro ejemplo la fecha debe estar repetida entonces debemos filtrar usando la columna de fecha (VTC_FECHAX se llama en esta tabla). Desde luego que podemos filtrar por cualquier otra columna, siempre y cuando tenga valores repetidos esta técnica funcionará.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

 

Anuncios