Base De Datos
La cláusula GROUP BY combina los registros con valores idénticos en la lista de campos especificada en un único registro. Para cada registro se puede crear un valor agregado si se incluye una función SQL agregada como por ejemplo SUM o COUNT, en la instrucción SELECT. Su sintaxis es:
SELECT [ALL | DISTINCT ]
<nombre_campo>[{,<nombre_campo>}] [{,<funcion_agregación>}]
FROM <nombre_tabla>|<nombre_vista>
[{,<nombre_tabla>|<nombre_vista>}]
[WHERE <condición> [{ AND|OR <condición>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condición>[{ AND|OR <condición>}]]
[ORDER BY <nombre_campo>|<campo_índice> [ASC | DESC][{,<nombre_campo>|<campo_índice> [ASC | DESC ]}]]
En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la cláusula HAVING filtra los registros una vez agrupados.
La evaluación de las diferentes cláusulas en tiempo de ejecución, se efectúa en el siguiente orden:
Cláusula | Descripción |
WHERE | Filtra las filas |
GROUP BY | Crea una tabla de grupo nueva|
HAVING | Filtra los grupos |
ORDER BY | Clasifica la salida |
Los valores NULL en los campos de GROUP BY se agrupan y no se omiten. Sin embargo, los valores NULL no se calculan en ninguna función de agregado SQL.
Un ejemplo de SELECT de grupos es consultar los empleados agrupados por su oficio. Un primer intento de consulta es el siguiente:
SELECT oficio,nombreEmpleado
FROM empleado
GROUP BY oficio
Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de agrupamiento. En otras palabras, la columna nombreEmpleado debe tener una función de agrupamiento que actue sobre ella (MAX, MIN, SUM, COUNT, AVG). De no serposible, deberá aparecer dicha columna a la cláusula GROUP BY.
La consulta correcta quedaria así;
SELECT oficio, COUNT(nombreEmpleado) Elementos
FROM empleado
GROUP BY oficio
ORDER BY oficio
Ejemplo: Considere los alumnos inscritos en las materias que imparto durante Enero Junio 2011 en el ITV. La siguiente consulta obtieneel número de alumnos por género y materia.
SELECT Genero, COUNT(*) Alumnos
FROM alumnosITV
GROUP BY Genero
HAVING
La cláusula HAVING se utiliza para especificar una condición, se comporta como WHERE, con la diferencia que HAVING se aplica a grupos y no a tuplas (registros). Es decir HAVING filtra los registros agrupados.
Ejemplo:Considere la siguiente información relativa a automóviles, modelos y precios
MODELO | AÑO | PRECIO |
SABLE | 2001 | 50,000 |
AUDI-A4 | 2007 | 420,000 |
BMW-323 | 2000 | 115,000 |
PORSCHE BOXSTER-987 | 2002 | 310,000 |
MALIBU | 1998 | 32,000 |
STRATUS-RT | 2005 | 97,500 |
CHRYSLER 300-C | 2005 | 185,000 |
FUSION | 2006 | 150,000 |
CUTLASS EUROSPORT | 1992 | 25,000 |
CIVIC COUPE |2006 | 135,000 |
CIVIC LS-4L | 2004 | 89,000 |
ACCORD EXR-L4 | 1998 | 53,000 |
PLATINA | 2005 | 65,000 |
PLATINA | 2004 | 60,000 |
ALTIMA | 2003 | 92,000 |
ALTIMA | 2007 | 179,000 |
ALTIMA | 2005 | 105,000 |
PEUGEOT 206 XR | 2006 | 65,000 |
TOYOTA COROLLA XRS | 2009 | 190,000 |
VW SEDAN | 1998 | 25,000 |
Calcule el promedio por año para todas las marcas a partir del 2003.CREATE TABLE carros (
modelo CHAR(25),
year CHAR(4),
precio NUMBER
);
SELECT year,
TO_CHAR(AVG(precio),'999,999.22') media
FROM carros
GROUP BY year
HAVING year > 2002
ORDER BY year;...
Regístrate para leer el documento completo.