fbpx

Bienvenidos de nueva cuenta al curso de SQL básico, ahora que somos todos unos expertos en el uso de consultas multitabla, vamos a explorar algunas funciones y cláusulas nuevas que nos permitirán usar la sentencia SELECT para obtener resúmenes de los datos contenidos en nuestras tablas.

Cabe aclarar que una diferencia importante entre las consultas resumen y las otras que hemos explorado hasta el momento es que en las consultas normales las filas del resultado se obtienen directamente de las filas del origen de datos y cada dato que aparece en el resultado tiene su dato correspondiente en el origen de la consulta mientras que las filas generadas por las consultas resumen no representan datos del origen sino un total calculado sobre estos datos.

Funciones de agregado

Una función de agregado  acepta un grupo de datos (por lo regular una columna de datos) como argumento, y produce un único dato que resume el grupo. Por ejemplo la función AVG() acepta una columna de datos numéricos y devuelve la media aritmética (average) de los valores contenidos en la columna.

Todas las funciones de agregado tienen una estructura parecida:

Función ([ALL|DISTINCT] expression)

 

El grupo de valores sobre el que actúa la función lo determina el resultado de la expresión que será simplemente un nombre de columna o una expresión basada en una columna o varias del origen de datos.

La palabra ALL indica que se tiene que tomar en cuenta todos los valores de la columna. Si no se especifica, este es el valor por defecto.

Mientras que la palabra DISTINCT hace que se consideren todas las repeticiones del mismo valor como uno sólo (considera valores distintos).

A excepción de la función COUNT, todas las funciones de agregado ignoran los valores NULL.

Función COUNT

Su estructura es como sigue:

COUNT ({[ALL|DISTINCT] expression | * } )

 

La expresión puede ser de cualquier tipo excepto text, image o ntext.

Como se mencionó anteriormente, esta función cuenta por defecto los valores NULL y se utiliza ALL y DISTINCT según las necesidades del programador.

Un ejemplo rápido sería el siguiente:

SELECT COUNT(Nombre) AS 'No. Proveedores' from Prov

SELECT COUNT(Nombre) AS 'No. Proveedores' from Prov

Uno pensaría que el resultado es realmente el número de proveedores que se tienen registrados en la respectiva tabla, sin embargo siempre existe un poco de error humano o algún otro contratiempo que haga que este valor no sea del todo cierto, por lo que para estar seguros que los registros contabilizados no están repetidos podemos hacer lo siguiente:

SELECT COUNT(DISTINCT Nombre) AS 'No. Proveedores' from Prov

SELECT COUNT(DISTINCT Nombre) AS 'No. Proveedores' from Prov

Como podemos notar, de alguna manera había ciertos valores repetidos y ahora realmente tenemos el número de proveedores (por nombre) que hay registrados en nuestra tabla.

Otra forma interesante de utilizar esta función es utilizando (*) en lugar de una expresión, de esta forma la función devuelve el número de filas del origen después de ejecutar la cláusula WHERE.

SELECT COUNT(*) AS 'Proveedores de Nuevo León' 

FROM Prov 

WHERE Estado='Nuevo Leon'

SELECT COUNT(*) AS 'Proveedores de Nuevo León' FROM Prov WHERE Estado='Nuevo Leon'

En este ejemplo contamos a todos los proveedores que son específicamente del estado de Nuevo León, de esta forma tenemos más opciones para diseñar estas consultas y que sean de mayor utilidad según se necesite.

 

Funciones MIN y MAX

Decidí agrupar estas 2 funciones en una sola sección ya que hacen cosas opuestas y tienen la misma estructura.

MAX/MIN ([ALL|DISTINCT] expression)

 

Mientras que la función MAX devuelve el valor máximo de la expresión, la función MIN devuelve el valor mínimo, en ambos casos sin considerar los nulos.

Ambas funciones se pueden usar con columnas numéricas, de caracteres y de datetime, pero no con columnas de bit.

A continuación, un pequeño ejemplo para cada función.


SELECT MAX(PrecioUnitario) AS 'Precio Máximo' FROM Art

SELECT MAX(PrecioUnitario) AS 'Precio Máximo' FROM Art

En este ejemplo tomamos de nuestra tabla de artículo la columna de precio unitario y consultamos el precio máximo registrado.

SELECT MIN(PrecioUnitario) AS 'Precio Mínimo' FROM Art

SELECT MIN(PrecioUnitario) AS 'Precio Mínimo' FROM Art

Ahora se trata del caso opuesto, buscando en nuestra tabla el registro del precio mínimo de los artículos.


Función SUM

SUM ([ALL|DISTINCT] expression ) 

 

Su nombre casi lo explica ya que devuelve la suma de los valores conseguidos con la expresión utilizada. En este caso solo es utilizable con columnas numéricas.

SELECT SUM(Importe) AS 'Total de Ventas' FROM Venta

SELECT SUM(Importe) AS 'Total de Ventas' FROM Venta

Se hace una sumatoria de todos los importes de todas las ventas y así se puede conseguir un total de las ventas registradas (sí, en esta base de datos de prueba hay muchos registros).

 

Función AVG

AVG ([ALL|DISTINCT] expression)

 

Esta función devuelve el promedio de los valores de un grupo, dicho esto, cabe mencionar que se omiten los valores nulos.

Las situaciones ya mencionadas con anterioridad respecto a las expresiones aplican de la misma forma para esta función.

SELECT AVG(cd.Cantidad*cd.Precio) AS 'CostoPromedio' FROM CompraD AS cd 

SELECT AVG(cd.Cantidad*cd.Precio) AS 'CostoPromedio' FROM CompraD AS cd 

Esta consulta nos permite saber el costo promedio por orden de compra y a diferencia de los ejemplos anteriores, esta vez utilizamos una expresión distinta a solo el nombre de la columna.

 

Cláusula GROUP BY (Agrupamiento de filas)

Si han prestado atención podrán haber notado que los ejemplos de las funciones se componen totales de todas las filas origen con una única fila como resultado, sin embargo, a menudo se requiere obtener totales parciales ya sea para saber qué tanto ha vendido un empleado en específico o cuál artículo es el más solicitado.

En caso de que se quiera obtener este tipo de resultados es necesario utilizar la cláusula GROUP BY.

Una consulta con una cláusula GROUP BY agrupa los datos de la tabla origen y produce una única fila resultado por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación o agrupamiento.

Cuando queremos realizar una agrupación múltiple, por varias columnas, éstas se indican en la cláusula GROUP BY en el orden de mayor a menor agrupación igual que con la cláusula ORDER BY.


SELECT cd.ID,AVG(cd.Cantidad*cd.Precio) AS 'CostoPromedio'

FROM CompraD AS cd

GROUP BY cd.ID

Esta consulta nos permite saber el costo promedio por orden de compra y a diferencia de los ejemplos anteriores, esta vez utilizamos una expresión distinta a solo el nombre de la columna. Cláusula GROUP BY (Agrupamiento de filas) Si han prestado atención podrán haber notado que los ejemplos de las funciones se componen totales de todas las filas origen con una única fila como resultado, sin embargo, a menudo se requiere obtener totales parciales ya sea para saber qué tanto ha vendido un empleado en específico o cuál artículo es el más solicitado. En caso de que se quiera obtener este tipo de resultados es necesario utilizar la cláusula GROUP BY. Una consulta con una cláusula GROUP BY agrupa los datos de la tabla origen y produce una única fila resultado por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación o agrupamiento. Cuando queremos realizar una agrupación múltiple, por varias columnas, éstas se indican en la cláusula GROUP BY en el orden de mayor a menor agrupación igSELECT cd.ID,AVG(cd.Cantidad*cd.Precio) AS 'CostoPromedio' FROM CompraD AS cd GROUP BY cd.ID

Utilizando parte de una consulta de ejemplo anterior, tenemos el costo promedio pero esta vez por cada orden de compra, de tal manera la información puede llegar a ser más útil.

Cláusula HAVING(Selección sobre grupos de filas)

Cuando se quiere utilizar una cláusula de selección sobre filas de origen utilizamos WHERE pero en el caso de las consultas resumen en donde manejamos grupos de filas tenemos la cláusula HAVING.

Funciona de la misma manera que WHERE pero en lugar de actuar sobre las filas del origen de datos, HAVING actúa sobre las filas del resultado.

Siempre que en una condición de selección haya una función de columna, la condición deberá incluirse en la cláusula HAVING, además, HAVING filtra filas del resultado así que sólo puede contener expresiones (nombres de columnas, expresiones, funciones…) que también pueden aparecer en la lista de selección, por lo que se aplica la regla a no olvidar:

En la cláusula HAVING un nombre de columna no puede aparecer fuera de una función de agregado si no es una columna de agrupación.

SELECT COUNT(vd.Articulo) AS ‘Artículos Registrados’,vd.ID

FROM ventaD AS vd

GROUP BY vd.ID

HAVING COUNT(vd.Articulo)  < 3

SELECT COUNT(vd.Articulo) AS 'Artículos Registrados',vd.ID FROM ventaD AS vd GROUP BY vd.ID HAVING COUNT(vd.Articulo) < 3

Con esta consulta podemos obtener no la cantidad de artículos por orden de venta sino que especificamos que solo queremos las órdenes de venta con su respectivo registro de artículos que sean menores a 3.

Sabiendo ahora la manera particular en que cada una de estas funciones y cláusulas actúa, podemos explorar una gran variedad de posibilidades al combinarlas y diseñar consultas que obtengan los resultados que deseamos.

Esto es todo por esta lección, en la siguiente nota explicaremos el tema de las subconsultas, algo interesante y que se llega a necesitar con bastante frecuencia ya que se trata de una consulta dentro de otra consulta pero eso ya lo veremos a profundidad el siguiente mes.

Si tienen alguna duda respecto al tema tratado o incluso de SQL básico en general, no duden en preguntar en los comentarios.

¡Nos leemos hasta la otra!

Referencias

https://www.w3schools.com/SQl

Documentación sobre SQL de Microsoft: https://docs.microsoft.com/en-us/sql

Imágenes de la nota: screenshots tomadas por la autora en SQL Server.

Imagen principal modificada pero inicialmente tomada de: https://www.campusmvp.es/recursos/image.axd?picture=SQL-Lenguaje_1.png

sorayagami02
Soy una chica gamer que últimamente pasa demasiado tiempo dejando los juegos a medias... !eso no es bueno, eh! Leo fanfics a todas horas del día y tengo fandoms a morir así que, sí, soy toda una fangirl.

Deja un comentario

A %d blogueros les gusta esto: