Si necesitamos consultar cuales son las Facturas que debemos cobrar hoy, que debemos cobrar en 7 días, en 15 días, en 30 días (y por supuesto, en cualquier otra fecha) podemos hacerlo de varias maneras, aquí hay cuatro de ellas:

Ejemplo:

Tenemos una tabla llamada FACTURAS donde se encuentran las fechas de vencimiento de las Facturas de venta, la tabla tiene esta estructura:

FACTURAS1

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

y contiene estas filas:

FACTURAS2

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

Método 1. Usando UNION

Podemos usar el comando UNION para unir el resultado de una consulta con el resultado de otra consulta. En este caso, para diferenciar los resultados y saber a cual consulta pertenecen los resultados debemos agregarle una columna a cada consulta. En este ejemplo esa columna agregada se llama FECHA.

CREATE VIEW V_VENCIMIENTOS(
   FECHA,
   FAC_FECVEN,
   FAC_NUMERO,
   FAC_MONTOX)
AS

   SELECT
      'HOY' AS FECHA,
      FAC_FECVEN,
      FAC_NUMERO,
      FAC_MONTOX
   FROM
      FACTURAS
   WHERE
      FAC_FECVEN = CURRENT_DATE

   UNION

   SELECT
      'SEMANA' AS FECHA,
      FAC_FECVEN,
      FAC_NUMERO,
      FAC_MONTOX
   FROM
     FACTURAS
   WHERE
      FAC_FECVEN BETWEEN CURRENT_DATE + 1 AND CURRENT_DATE + 6

   UNION

   SELECT
      'QUINCENA' AS FECHA,
      FAC_FECVEN,
      FAC_NUMERO,
      FAC_MONTOX
   FROM
      FACTURAS
   WHERE
      FAC_FECVEN BETWEEN CURRENT_DATE + 7 AND CURRENT_DATE + 14

   UNION

   SELECT
      'MES' AS FECHA,
      FAC_FECVEN,
      FAC_NUMERO,
      FAC_MONTOX
   FROM
      FACTURAS
   WHERE
      FAC_FECVEN BETWEEN CURRENT_DATE + 15 AND CURRENT_DATE + 30;

Aquí, a las Facturas que vencen hoy les unimos las que vencen en la semana, les unimos las que vencen en la quincena y les unimos las que vencen en el mes. Se usa la cláusula BETWEEN para delimitar las fechas de las Facturas que serán mostradas y evitar así que una Factura se muestre más de una vez.

Escribimos esta consulta:

SELECT * FROM V_VENCIMIENTOS ORDER BY FAC_FECVEN

Y este es el resultado que obtenemos:

FACTURAS3

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

Donde cada Factura aparece en una fila y en la primera columna podemos ver si su vencimiento corresponde al día de hoy, a la semana, a la quincena o al mes.

Método 2. Usando un stored procedure

Aquí, en lugar de mostrar los vencimientos en filas los mostramos en columnas porque para algunas personas puede ser más descriptivo de esta manera:

CREATE PROCEDURE VENCIMIENTOS
   RETURNS(
      ftcNumero1 TYPE OF COLUMN FACTURAS.FAC_NUMERO,
      ftnMonto1  TYPE OF COLUMN FACTURAS.FAC_MONTOX,
      ftcNumero2 TYPE OF COLUMN FACTURAS.FAC_NUMERO,
      ftnMonto2  TYPE OF COLUMN FACTURAS.FAC_MONTOX,
      ftcNumero3 TYPE OF COLUMN FACTURAS.FAC_NUMERO,
      ftnMonto3  TYPE OF COLUMN FACTURAS.FAC_MONTOX,
      ftcNumero4 TYPE OF COLUMN FACTURAS.FAC_NUMERO,
      ftnMonto4  TYPE OF COLUMN FACTURAS.FAC_MONTOX)
AS
   DECLARE VARIABLE lcNumero TYPE OF COLUMN FACTURAS.FAC_NUMERO;
   DECLARE VARIABLE lnMontox TYPE OF COLUMN FACTURAS.FAC_MONTOX;
   DECLARE VARIABLE ldFecVen TYPE OF COLUMN FACTURAS.FAC_FECVEN;
BEGIN

   FOR SELECT
      FAC_NUMERO,
      FAC_MONTOX,
      FAC_FECVEN
   FROM
      FACTURAS
   WHERE
      FAC_FECVEN BETWEEN CURRENT_DATE AND CURRENT_DATE + 30
   ORDER BY
      FAC_FECVEN
   INTO
      :lcNumero,
      :lnMontox,
      :ldFecVen
   DO BEGIN
      ftcNumero1 = NULL;
      ftnMonto1  = NULL;
      ftcNumero2 = NULL;
      ftnMonto2  = NULL;
      ftcNumero3 = NULL;
      ftnMonto3  = NULL;
      ftcNumero4 = NULL;
      ftnMonto4  = NULL;
      IF (ldFecVen = CURRENT_DATE) THEN BEGIN
         ftcNumero1 = lcNumero;
         ftnMonto1  = lnMontox;
      END
      IF (ldFecVen BETWEEN CURRENT_DATE + 1 AND CURRENT_DATE + 6) THEN BEGIN
         ftcNumero2 = lcNumero;
         ftnMonto2  = lnMontox;
      END
      IF (ldFecVen BETWEEN CURRENT_DATE + 7 AND CURRENT_DATE + 14) THEN BEGIN
         ftcNumero3 = lcNumero;
         ftnMonto3  = lnMontox;
      END
      IF (ldFecVen BETWEEN CURRENT_DATE + 15 AND CURRENT_DATE + 30) THEN BEGIN
         ftcNumero4 = lcNumero;
         ftnMonto4  = lnMontox;
      END
      SUSPEND;
   END

END;

Como se trata de un stored procedure seleccionable lo ejecutamos así:

SELECT * FROM VENCIMIENTOS

Y este será el resultado que obtendremos:

FACTURAS3

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

Si no quieres ver los Null puedes usar la función COALESCE() para que desaparezcan.

Método 3. Usando una vista con una tabla CTE

Ya hemos visto en artículos anteriores lo útiles que pueden ser las tablas CTE, aquí también pueden ser usadas:

CREATE VIEW V_VENCIMIENTOS(
   FAC_FECVEN,
   HOY,
   FAC_MONTOX,
   SEMANA,
   FAC_MONTOX1,
   QUINCENA,
   FAC_MONTOX2,
   MES,
   FAC_MONTOX3)
AS

   WITH FacturasVencen AS (
      SELECT
         FAC_NUMERO,
         FAC_MONTOX,
         FAC_FECVEN
      FROM
         FACTURAS
   )

   SELECT
      F.FAC_FECVEN,
      F1.FAC_NUMERO AS "HOY",
      F1.FAC_MONTOX,
      F2.FAC_NUMERO AS "SEMANA",
      F2.FAC_MONTOX,
      F3.FAC_NUMERO AS "QUINCENA",
      F3.FAC_MONTOX,
      F4.FAC_NUMERO AS "MES",
      F4.FAC_MONTOX
   FROM
      FACTURAS F
   LEFT JOIN
      FacturasVencen F1
         ON F.FAC_NUMERO = F1.FAC_NUMERO AND
            F1.FAC_FECVEN = CURRENT_DATE
   LEFT JOIN
      FacturasVencen F2
         ON F.FAC_NUMERO = F2.FAC_NUMERO AND
            F2.FAC_FECVEN BETWEEN CURRENT_DATE + 1 AND CURRENT_DATE + 6
   LEFT JOIN
      FacturasVencen F3
         ON F.FAC_NUMERO = F3.FAC_NUMERO AND
            F3.FAC_FECVEN BETWEEN CURRENT_DATE + 7 AND CURRENT_DATE + 14
   LEFT JOIN
      FacturasVencen F4
         ON F.FAC_NUMERO = F4.FAC_NUMERO AND
            F4.FAC_FECVEN BETWEEN CURRENT_DATE + 15 AND CURRENT_DATE + 30
   WHERE
      F1.FAC_FECVEN IS NOT NULL OR
      F2.FAC_FECVEN IS NOT NULL OR
      F3.FAC_FECVEN IS NOT NULL OR
      F4.FAC_FECVEN IS NOT NULL;

Y al ejecutar a esa vista con este comando:

SELECT * FROM V_VENCIMIENTOS ORDER BY FAC_FECVEN

Este será el resultado que obtendremos:

FACTURAS4

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

Si no quieres ver los Null puedes usar la función COALESCE() para que desaparezcan.

Método 4. Usando una tabla en el FROM

También puedes ver las Facturas en filas con esta consulta:

SELECT
   *
FROM (
   SELECT
      CASE WHEN FAC_FECVEN = CURRENT_DATE THEN 'HOY'
           WHEN FAC_FECVEN BETWEEN CURRENT_DATE +  1 AND CURRENT_DATE +  6 THEN 'SEMANA'
           WHEN FAC_FECVEN BETWEEN CURRENT_DATE +  7 AND CURRENT_DATE + 14 THEN 'QUINCENA'
           WHEN FAC_FECVEN BETWEEN CURRENT_DATE + 15 AND CURRENT_DATE + 30 THEN 'MES'
      END AS FECHA_VENCIMIENTO,
      FAC_NUMERO,
      FAC_FECVEN,
      FAC_MONTOX
   FROM
      FACTURAS
   WHERE
      FAC_FECVEN BETWEEN CURRENT_DATE AND CURRENT_DATE + 30
 ) AS MiTabla
ORDER BY
   FAC_FECVEN

Y este será el resultado obtenido:

FACTURAS5

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

Conclusión:

Con todos los métodos obtenemos las Facturas que debemos cobrar pero la forma de salida de los resultados es diferente, a veces una de las salidas es la preferible. También en algunos métodos se escribe mucho más que en otros.

Artículo relacionado:

El índice del blog Firebird21

Anuncios