Obteniendo las ventas realizadas la semana pasada

Deja un comentario

Supongamos que tienes una tabla de ventas y deseas conocer ¿cuáles fueron las ventas realizadas la semana pasada?

Puedes obtener la respuesta con un SELECT similar al siguiente:

Listado 1:

SELECT
   *
FROM
   MiTabla
WHERE
   MiColumnaFecha BETWEEN CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE) - 6 AND
CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE)
ORDER BY
   MiColumnaFecha

En el Listado 1. se supone que las semanas empiezan los días Lunes, si necesitas que empiecen los días Domingo entonces a la primera fecha del BETWEEN deberías restarle 7 (y no 6) y a la segunda fecha deberías restarle 1.
Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

Anuncios

Ejemplo Nº 052 – Comparando strings

Deja un comentario

Cuando comparamos strings el resultado puede no ser el que esperábamos si es que no lo hacemos bien.

Ejemplo:

SELECT
   1
FROM
   RDB$DATABASE
WHERE
   'A' = 'A      '

Este SELECT devolverá 1 aunque los strings son diferentes. ¿Es eso correcto o incorrecto? Pues es lo correcto según el estándar SQL el cual dice lo siguiente: “cuando se comparan strings de distinta longitud, la comparación debe ser hecha como si al string más corto se le agregaran espacios en blanco hasta la longitud del string más largo”.

¿Y si queremos que la condición no se cumpla cuándo las longitudes son diferentes?

En ese caso deberemos utilizar LIKE, como vemos a continuación:

SELECT
   1
FROM
   RDB$DATABASE
WHERE
   'A' LIKE 'A   '

Aquí el resultado de la consulta será un conjunto vacío porque la condición no se cumple.

Conclusión:

Si quieres que la comparación entre dos strings sea estricta (o sea que sean idénticos y que tengan la misma longitud) debes usar el operador LIKE, no el símbolo =

Artículo relacionado:

El índice del blog Firebird21

Ejemplo Nº 051 – ¿Cómo saber si una tabla tiene registros?

4 comentarios

A veces queremos saber si una tabla tiene registros (filas). No nos interesa saber cuantas filas tiene sino si tiene alguna. Hay varias formas de obtener esa información:

Ejemplo 1:

SELECT
   COUNT(*)
FROM
   MiTabla

Esto funciona pero si la tabla tiene muchos millones de registros será muy lento porque el Firebird contará cuantas filas hay en la tabla y nos devolverá el resultado y esto tomará un buen tiempo. Pero no queremos saber cuantas filas hay en la tabla, solamente queremos saber si tiene filas o no y con este método estamos perdiendo mucho tiempo innecesariamente.

Ejemplo 2:

SELECT
   MIN(MiColumna)
FROM
   MiTabla

Si la tabla tiene un índice ascendente sobre la columna “MiColumna” entonces hallar el mínimo de esa columna será muy rápido. Este método es mucho más eficiente que el del Ejemplo 1, el resultado se obtiene mucho más rápido.

Ejemplo 3:

SELECT
   MiColumna
FROM
   MiTabla
WHERE
   MiColumna > 0
ROWS
   1 TO 1

Y este método es el más eficiente de los tres ya que el Firebird ni siquiera necesita llamar a una función sino simplemente verifica si la primera fila tiene un valor mayor que cero y si ese es el caso ya devuelve el resultado porque ROWS 1 TO 1 le dice que devuelva una fila. Desde luego que “MiColumna” debería ser de tipo numérico y todos sus valores mayores que cero. Si ese no es el caso entonces habría que poner una condición que se cumpla siempre, en el 100% de los casos, para que este método sea el más rápido. En general lo conveniente es que “MiColumna” sea la Primary Key, que es una columna autoincremental y por lo tanto siempre tiene valores mayores que cero.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

Ejemplo Nº 050 – Más sobre el uso de DISTINCT

1 comentario

En el ejemplo Nº 049 que puedes leer aquí:

https://firebird21.wordpress.com/2013/05/03/ejemplo-no-049-usando-distinct/

hemos visto una forma de usar la cláusula DISTINCT, aquí tenemos otra:

SELECT
   COUNT(DISTINCT PRD_UNIMED)
FROM
   PRODUCTOS

Mediante este SELECT podemos conocer la cantidad de unidades de medida distintas que están registradas en la tabla de PRODUCTOS. Por ejemplo, si en dicha tabla tenemos las unidades de medida: KLG, LTS, MTS, UNI, (kilogramos, litros, metros, unidades) entonces el resultado que obtendremos será 4.

Si en nuestra tabla de PRODUCTOS tenemos una columna llamada PRD_PROCED donde se registran los países de procedencia de nuestros productos entonces escribiendo:

SELECT
   COUNT(DISTINCT PRD_PROCED)
FROM
   PRODUCTOS

podremos saber de cuantos países distintos proceden los productos de nuestro stock.

No solamente podemos escribir DISTINCT dentro de la función COUNT(), también podemos escribirlo dentro de cualquiera de las otras funciones agregadas: AVG(), MAX(), MIN(), SUM()

También es posible escribir una función dentro de otra función, como en este ejemplo.

SELECT
   COUNT(DISTINCT Left(PRD_NOMBRE,3))
FROM
   PRODUCTOS

Ejemplo Nº 049 – Usando DISTINCT

9 comentarios

Cuando escribes un SELECT tienes la posibilidad de decirle que deseas que te devuelva todos los resultados o solamente aquellos que son distintos a los demás.

Por ejemplo, supongamos que deseamos conocer todas las unidades de medida utilizadas por nuestros productos. La columna donde se guarda ese dato se llama PRD_UNIMED.

SELECT
   DISTINCT
   PRD_UNIMED
FROM
   PRODUCTOS

La cláusula DISTINCT le obliga al Firebird a mostrarnos solamente una vez a cada unidad de medida. Eso quiere decir que aunque haya 240 productos cuya unidad de medida sea KLG (kilogramos) la palabra KLG aparecerá una sola vez en el resultado. ¿Por qué? porque escribimos la cláusula DISTINCT.

En la tabla VENTASCAB guardamos los datos de cabecera de cada venta realizada (sucursal, fecha, identificador del cliente, etc.), ¿cuáles son los años que tenemos registrados en esa tabla? ¿se encuentran allí las ventas que hicimos en el año 2006?. Lo podremos saber fácilmente con este SELECT:

SELECT
   DISTINCT
   EXTRACT(YEAR FROM VTC_FECHAX)
FROM
   VENTASCAB

cada uno de los años de las ventas registradas aparecerá una vez y solamente una vez. Por ejemplo, podríamos obtener:

2008
2009
2010
2011
2012
2013

entonces, aunque la tabla VENTASCAB tenga miles y miles de filas solamente veríamos 6 filas, las que corresponden a cada uno de los años en que se registraron ventas.

 

Ejemplo Nº 048 – Usando funciones (3)

1 comentario

En este ejemplo veremos como usar las funciones:

  • MAX()
  • MIN()
SELECT
   PRD_PROCED,
   MAX(PRD_PREVTA),
   MIN(PRD_PREVTA)
FROM
   PRODUCTOS
GROUP BY
   PRD_PROCED

En este ejemplo, por cada país de procedencia de los productos, vemos cual es el mayor precio de venta y cual es el menor precio de venta.

Como estamos agrupando por país de procedencia de los productos, las funciones MAX() y MIN() nos devolverán el mayor y el menor precio de venta de los productos de cada país.

.

Ejemplo Nº 047 – Usando funciones (2)

2 comentarios

En este ejemplo veremos como usar la función:

  • LIST()

La función LIST() devuelve una cadena de caracteres consistiendo de todos los valores que no sean NULL en ese grupo. Esos valores pueden estar separados por una coma (por defecto) o por cualquier otro carácter que el programador especifique. Si todos los valores del grupo son NULL o el grupo está vacío, la función LIST() devuelve NULL.

SELECT
   PRD_PROCED,
   LIST(PRD_NOMBRE)
FROM
   PRODUCTOS
GROUP BY
   PRD_PROCED

Este SELECT nos mostrará todos los productos provenientes de cada uno de los países de procedencia. La columna LIST(PRD_NOMBRE) puede ser muy larga ya que en ella se encontrarán todos los productos que provienen de un país.

 

.

 

Older Entries