Está en la página 1de 8

Agrupamiento de registros y funciones agregadas

SQL permite combinar en un único registro, registros con valores idénticos en la lista de campos que se
especifique. Una vez indicado por qué campo/s queremos agrupar la información, se pueden utilizar funciones
de agregación que realizarán operaciones resumen sobre el grupo de registros (cuenta de registros, suma,
media aritmética, máximo o mínimo, etc.).
Para indicar que se desea realizar un agrupamiento de registros se utiliza la cláusula Group By indicando
aquellos campos por los que se desee agrupar la información.

Las funciones de agregación más importantes se muestran en la tabla, todas ellas, excepto COUNT(*) ignoran
cualquier nulo en sus argumentos.

Función Descripción

AVG Utilizada para calcular el promedio de los valores de un campo determinado

COUNT Utilizada para devolver el número de registros de la selección

SUM Utilizada para devolver la suma de todos los valores de un campo determinado

MAX Utilizada para devolver el valor más alto de un campo especificado

MIN Utilizada para devolver el valor más bajo de un campo especificado

Group By
Group By combina en un único registro los registros los valores idénticos en la lista de campos especificada.
Suele ir acompañada de alguna función resumen o de agregado. Si se incluye alguna función de agregado en el
comando SELECT, se creará un valor resumen para cada registro si no se incluye ninguna función agregada los
valores de resumen se omiten.

El orden de los nombres de los campos determinará los niveles de agrupamiento, del más alto al más
bajo.
GROUP BY puede hacer referencia a cualquier campo de la tabla, incluso sin que esté presente en la cláusula
SELECT siempre que el comando SELECT haga referencia a alguna función de agregado de SQL.

Todos los campos de la lista de campos de SELECT deben o bien incluirse en la cláusula GROUP BY o
como argumentos de una función SQL agregada

• Los valores Null en los campos GROUP BY se agrupan y no se omiten, pero, no se evalúan en
ninguna de las funciones SQL agregadas.
• Para excluir aquellas filas que no se desea agrupar se utiliza la cláusula WHERE y, para excluir las
filas una vez agrupadas se utiliza la cláusula HAVING.
• Los datos tipo Memo, Objetos OLE, etc., no se pueden agrupar.

13
“Lista los números de departamento y la suma de los salarios de cada uno de ellos”

SELECT sum(sal), deptno DEPTNO SUM(SAL)


------- --------
FROM emp
10 8750
GROUP BY deptno 20 10875
30 9400
Lógicamente, no se pueden seleccionar atributos que no se puedan agrupar por los atributos indicados en el
GROUP BY. Por ejemplo, la sentencia

SELECT ENAME, DEPTNO, SUM(SAL) –- ¡¡¡Error!!!


FROM EMP
GROUP BY DEPTNO;

daría un error o un resultado incorrecto, ya que en cada departamento el nombre del empleado no se puede
agrupar por departamento.

Cada expresión de SELECT debe ser:

1. Una constante o una función sin parámetros (p.ej: SYSDATE)

2. Contener una función de agrupación (SUM,COUNT, MAX, ...)

3. Emparejar con una expresión del GROUP BY

HAVING. Restricciones en los agrupamientos


Cuando se selecciona un conjunto de atributos agrupados por uno o más atributos, se pueden imponer
condiciones a los grupos, en este caso se utiliza la cláusula HAVING, que sería el equivalente a la cláusula
WHERE aplicada a los grupos.

HAVING elimina los grupos para los cuales la expresión da como resultado FALSO o DESCONOCIDO. Por
ejemplo,
“Lista la suma de los sueldos agrupada por departamentos, pero sólo aquellos en los que la suma sea
mayor que 10000, o que el departamento sea el 30”

SELECT DEPTNO, SUM(SAL)


FROM EMP SUM(SAL) DEPTNO
GROUP BY DEPTNO -------- -------
HAVING SUM(SAL)>10000 OR DEPTNO=30; 10875 20
9400 30

Funciones de agregado

AVG o media aritmética


Calcula la media aritmética de un conjunto de valores contenidos en un campo especificado de una consulta.

14
Avg(expr)

En donde expr representa el campo que contiene los datos numéricos para los que se desea calcular la media
o una expresión que realiza un cálculo utilizando los datos de dicho campo.

La función Avg no incluye ningún campo Null en el cálculo.


Media de los salarios de cada departamento ordenados por departamento
DEPTNO PromedioDeSAL
SELECT DEPTNO, Avg(SAL) AS PromedioDeSAL
FROM EMP 10 2916.666667
GROUP BY DEPTNO
20 2175.000000
ORDER BY DEPTNO;
30 1566.666667
Media de las comisiones de cada departamento
DEPTNO PromedioDeCOMM
¿Cuántos registros utilizó para realizar la media?
10 NULL

20 NULL

30 550.

Count
Calcula el número de registros devueltos por una consulta.

Count(expr)

En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el
nombre de un campo de una tabla, una constante o una función que no puede ser una función agregada de
SQL. Puede contar cualquier tipo de datos.

Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de registros sin
tener en cuenta qué valores se almacenan en los registros. La función Count no cuenta los registros que tienen
campos null a menos que expr sea el carácter comodín asterisco (*). Count(*) es considerablemente más
rápida que Count(Campo).

“Media de las comisiones de cada departamento indicando el número de empleados y el número de


comisiones contabilizadas en la operación”

SELECT DEPTNO, Avg(comm) AS


PromedioDeCOMM, count(comm) PromedioDeCOMM COMISIONES empleados
as COMISIONES, count(ename) 10 NULL 0 3
AS empleados
FROM EMP 20 NULL 0 5
GROUP BY DEPTNO 30 550 4 6
ORDER BY DEPTNO;
Si expr identifica a múltiples campos:
• la función Count cuenta un registro sólo si al menos uno de los campos no es Null.
• Si todos los campos especificados son Null, no se cuenta el registro.
• Hay que separar los nombres de los campos con ampersand (&).

15
SELECT Count(FechaEnvío & Transporte) AS Total
FROM Pedidos;

Max, Min
Devuelven el mínimo o el máximo de un conjunto de valores contenidos en un campo especifico de una
consulta. Su sintaxis es:

Min(expr)
Max(expr)

En donde expr es el campo sobre el que se desea realizar el cálculo.

Expr pueden incluir el nombre de un campo de una tabla, una constante o una función que no sea una de las
funciones agregadas de SQL.
“Lista el sueldo mínimo, máximo y medio de los empleados y el número total de éstos”

MIN(SAL) MAX(SAL) AVG(SAL) COUNT(*)


-------- -------- -------- --------
800 5000 2073.21 14

Sum
Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta.

Otras funciones de agregado


La implementación de otras funciones de agregado depende del SGBD que estemos usando, suelen estar
implementadas las funciones estadísticas de uso común. Como ejemplo, añadimos a los apuntes la desviación
estándar

Desviación estándar

Devuelve estimaciones de la desviación estándar para la población (el total de los registros de la tabla) o una
muestra de la población representada (muestra aleatoria) . Su sintaxis es:

Oracle
• STDDEV
MySQL
• STD(expr), STDDEV(expr)

Retorna la desviación estándard de expr. Esta es una extensión del estándar SQL. La forma STDDEV()
de esta función se proporciona para compatibilidad con Oracle. Desde MySQL 5.0.3, la función
estándar SQL STDDEV_POP() puede usarse en su lugar.

16
• STDDEV_POP(expr)

Retorna la desviación estándar de expr (la raíz cuadrada de VAR_POP()). Esta función se añadió en
MySQL 5.0.3. Antes de 5.0.3, puede usar STD() o STDDEV(), que son equivalentes pero no SQL
estándar.

• STDDEV_SAMP(expr)

Retorna la muestra de la desviación estándar de expr (la raíz cuadrada de VAR_SAMP(). Esta función
se añadió en MySQL 5.0.3.
SQL Server
• StDev(expr)

• StDevP(expr)

StDevP evalúa una población, y StDev evalúa una muestra de la población. Si la consulta contiene
menos de dos registros (o ningún registro para StDevP), estas funciones devuelven un valor Null (el
cual indica que la desviación estándar no puede calcularse).

Otras funciones
La implementación de las funciones depende del SGBD, casi todos incluyen un gran número de funciones para
trabajar con números, fechas y cadenas de caracteres.

En la lista que viene a continuación, se indican las funciones más habituales con la sintaxis utilizada por el
SGBD Oracle.

Funciones para datos numéricos

- AVG ([DISTINCT] Atributo): media aritmética

- MIN (Atributo): valor mínimo

- MAX (Atributo): valor máximo

- SUM ([DISTINCT] Atributo): suma

- STDDEV (Atributo): desviación estándar

- VARIANCE (Atributo): varianza

- ABS (Atributo): valor absoluto

- CEIL (Atributo): entero más próximo por encima

- FLOOR (Atributo): entero más próximo por debajo

- MOD (Atributo, Atributo2): resto de dividir Atributo entre Atributo2. Si Atributo2=0 devuelve Atributo
Atributo2
- POWER (Atributo, Atributo2): Atributo

- ROUND (Atributo [, m]): redondeo de Atributo a m dígitos

17
- TRUNC (Atributo [, m]): trunca Atributo a m dígitos

- SIGN (Atributo):
Si Atributo < 0 devuelve (-1)
Si Atributo = 0 devuelve 0
Si Atributo > 0 devuelve 1
- SQRT (Atributo): raíz cuadrada del valor del Atributo

- COUNT ([DISTINCT] Atributo): Cuenta el número de filas donde expresión no es nulo

- COUNT (*): Cuenta el número de filas incluyendo aquellas con nulos

Funciones para datos de tipo carácter


- INITCAP (Atributo): pone a mayúscula la primera letra de cada palabra contenida en Atributo.

- LOWER (Atributo): transforma Atributo a minúsculas.

- UPPER (Atributo): transforma Atributo a mayúsculas.

- LTRIM (Atributo [, caracter]): elimina el carácter caracter (o blancos) por la izquierda hasta encontrar el
primer carácter que no está en caracter.

- RTRIM (Atributo [, caracter]): elimina el carácter caracter (o blancos) por la derecha hasta encontrar el
primer carácter que no está en caracter.

- SUBSTR (Atributo, m[, n]): devuelve una porción de Atributo comenzando en el carácter m y en n
caracteres de longitud.

- LENGTH (Atributo): devuelve la longitud de Atributo.

Funciones para datos de tipo fecha


Existe una amplia lista de funciones para ayudar a la manipulación de datos de tipo fecha. La información sobre
la fecha se encuentra en una tabla del diccionario de datos, denominada dual. Las funciones más importantes
son:

- sysdate: devuelve la fecha y hora actual.

o Ej: select sysdate from dual;

Resultado: 28-FEB-03 si el día actual es 28 de febrero de 2003

- last_day: último día del mes

o Ej: select last_day(sysdate) from dual;

Resultado: 31-MAR-03 si el día actual es 12 de marzo de 2003

- add_months(d, n): suma o resta n meses a partir de la fecha d

o Ej: select add_months(sysdate, 2) from dual;

18
Resultado: 18-MAY-03 si el día actual es 18 de marzo de 2003

- months_between(f, s): diferencia en meses entre la fecha f y la fecha s

o Ej: select months_between(sysdate, ’12-MAR-03’) from dual;

Resultado: 13 si el mes actual es abril de 2003

- next_day(d, day): la fecha del día especificado de la semana después del día actual

o Ej: select next_day(sysdate, ‘Lunes’) from dual;

Resultado: 20-OCT-03 si el día actual es 14 de octubre de 2003

Funciones de conversión
- TO_CHAR (Atributo[, formato]): convierte Atributo (numérico o fecha) a un string con el formato especificado.

Posibles máscaras para fecha: Y, YY, YYY, YYYY, YEAR (en letra)

MONTH (nombre completo), MON (3 letras), MM (01-12)

DDD (1-366), DD (1-31), D(1-7), DAY (en letra), DY (3 letras)

- TO_DATE (Atributo[, formato]): convierte Atributo a fecha con el formato especificado.

- TO_NUMBER (Atributo[, formato]): convierte Atributo a un número.

Ejercicios
1. Buscar y documentar las funciones más comunes para los SGBD SQL Server.
2. Obtener el último empleado por orden alfabético.

3. ¿Cuáles son los salarios más altos y más bajos de cada departamento?
máximo mínimo depto

5000.00 1300.00 10

3000.00 800.00 20

2850.00 950.00 30
4. Salarios de los departamentos en los que la media supere 2000

19
5. ¿Cuántos empleados tiene cada jefe?

6. ¿Cuántos empleados tiene cada departamento?

7. Agrupa a los empleados por año de ingreso en la empresa. ¿Cuántos empleados entraron cada año?

8. Indica los datos de los empleados que no tengan comisión

9. ¿Cuántos empleados no tienen comisión?

10. ¿Cuántos empleados de cada departamento no tienen comisión?

11 ¿Qué departamentos tienen comisiones?

20

También podría gustarte