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:
Captura 1. Si haces clic en la imagen la verás más grande
y contiene estas filas:
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:
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:
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:
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:
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:
Deja un comentario