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

 

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.

 

.

 

Ejemplo Nº 046 – Usando funciones (1)

1 comentario

El Firebird dispone de muchas funciones que pueden resultarte de utilidad. En este ejemplo veremos como usar las funciones:

  • LEFT()
  • RIGHT()
  • TRIM()
SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   LEFT(PRD_NOMBRE, 1) = 'A'

El SELECT anterior te mostrará todos los productos cuyos nombres empiezan con la letra ‘A’. Si quieres que los nombres empiecen con las letras ‘AN’ entonces en el WHERE deberías escribir:

LEFT(PRD_NOMBRE, 2) = 'AN'

También puedes pedir que te muestre los nombres de todos los productos que terminan con una letra. Este SELECT te mostrará todos los que finalizan con la letra ‘S’

SELECT
 PRD_CODIGO,
 PRD_NOMBRE,
 PRD_PREVTA
FROM
 PRODUCTOS
WHERE
 RIGHT(TRIM(PRD_NOMBRE), 1) = 'S'

Fíjate que en el WHERE se usaron dos funciones: RIGHT() y TRIM(), ¿por qué eso? porque la función TRIM() quita todos los espacios en blanco que están a la derecha.

Es necesario usar la función TRIM() porque de no hacerlo la función RIGHT(PRD_NOMBRE, 1) en la gran mayoría de los casos devolvería un espacio en blanco y no es eso lo que queremos.

PRD_NOMBRE = 'SALCHICHAS              '
RIGHT(PRD_NOMBRE, 1) = ' '
RIGHT(TRIM(PRD_NOMBRE), 1) = 'S'

.

Ejemplo Nº 045 – Obtener el mínimo valor de una columna

1 comentario

Si lo que deseamos es obtener el mínimo valor de una columna, podemos emplear la función MIN().

SELECT
   MIN(PRD_PREVTA)
FROM
   PRODUCTOS

Fíjate que aquí no se usa la cláusula GROUP BY porque no queremos agrupar sino hallar el valor mínimo de la columna.

 

.

 

Ejemplo Nº 044 – Obtener el máximo valor de una columna

1 comentario

Si lo que deseamos es obtener el máximo valor de una columna, podemos emplear la función MAX().

SELECT
   MAX(PRD_PREVTA)
FROM
   PRODUCTOS

Fíjate que aquí no se usa la cláusula GROUP BY porque no queremos agrupar sino hallar el valor máximo de la columna.

En el Ejemplo Nº 037 vimos otra forma de responder a esta pregunta.

 

.

 

Older Entries