Práctica 4: GROUP BY y HAVING

Anuncio
Práctica 4: GROUP BY y HAVING
Repasando...
TABLA FACTURAS
SELECT codcli, codfac
FROM facturas
WHERE iva >= 7;
RESULTADO
CODCLI
CODFAC
9
7
7
9
5
15
21
7
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
II18--Universitat Jaume I
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
1
Práctica 4: GROUP BY y HAVING
Funciones de Columna...
SELECT COUNT(*)
FROM facturas
WHERE iva >= 7;
RESULTADO
TABLA FACTURAS
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
COUNT(*)
4
II18--Universitat Jaume I
2
Práctica 4: GROUP BY y HAVING
Funciones de Columna...
SELECT AVG(iva)
FROM facturas
WHERE iva >= 7;
RESULTADO
TABLA FACTURAS
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
AVG(iva)
13,75
( 16 + 16 + 16 + 7) / 4 = 13,75
II18--Universitat Jaume I
3
Práctica 4: GROUP BY y HAVING
Funciones de Columna...
SELECT codcli, AVG(iva)
FROM facturas
WHERE iva >= 7;
RESULTADO
TABLA FACTURAS
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
ERROR!!!
No se puede crear una tabla con codcli (4 valores) y AVG(iva) (1 solo valor).
II18--Universitat Jaume I
4
Práctica 4: GROUP BY y HAVING
Complicando la sentencia SELECT...
SELECT [DISTINCT] { * | col [, col ] }
FROM tabla
[ WHERE condición_búsqueda ]
[ GROUP BY col [, col ]
[HAVING condición_para_el_grupo ]
];
II18--Universitat Jaume I
5
Práctica 4: GROUP BY y HAVING
Utilizando GROUP BY...
SELECT codcli, COUNT(*)
FROM facturas
WHERE iva >= 7
GROUP BY codcli;
TABLA FACTURAS
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
RESULTADO
codcli
COUNT(*)
9
7
2
2
II18--Universitat Jaume I
6
Práctica 4: GROUP BY y HAVING
Utilizando GROUP BY...
SELECT codcli, AVG(iva)
FROM facturas
WHERE iva >= 7
GROUP BY codcli;
TABLA FACTURAS
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
RESULTADO
codcli
AVG(iva)
9
7
11,5
16
( 16 + 7 ) / 2 = 11,5
( 16 + 16 ) / 2 = 16
II18--Universitat Jaume I
7
Práctica 4: GROUP BY y HAVING
IMPORTANTE!!!
• Como vimos, las funciones de columna en el SELECT
devuelven un solo valor, por lo que no se pueden
recuperar junto con otras columnas.
• Sin embargo, cuando el SELECT se utiliza junto con
un GROUP BY, las funciones de columna devuelven
tantos valores como grupos se formen, por lo que se
pueden recuperar junto con alguna de las columnas del
GROUP BY.
II18--Universitat Jaume I
8
Práctica 4: GROUP BY y HAVING
Y ahora HAVING...
TABLA FACTURAS
SELECT codcli, COUNT(*)
FROM facturas
WHERE iva >= 7
GROUP BY codcli
HAVING AVG(iva) >= 16;
RESULTADO
codcli
COUNT(*)
7
2
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
12
15
0
( 16 + 7 ) / 2 = 11,5
NO
( 16 + 16 ) / 2 = 16
SI
II18--Universitat Jaume I
9
Práctica 4: GROUP BY y HAVING
IMPORTANTE!!!
• En el SELECT y en el HAVING solamente se pueden
poner las columnas que aparecen en el GROUP BY, y
funciones de columna sobre el resto de columnas de
la tabla.
SELECT codcli, iva
FROM facturas
MAL!!!
WHERE iva >= 7
GROUP BY codcli
HAVING AVG(iva)>= 16;
SELECT codcli, AVG(iva)
FROM facturas BIEN!!!
WHERE iva >= 7
GROUP BY codcli
HAVING AVG(iva)>= 16;
II18--Universitat Jaume I
10
Resumen de las reglas básicas
• Las funciones de columna sólo pueden aparecer en las cláusulas SELECT
y HAVING: o sea, nunca puede utilizarse ninguna función de columna en la
cláusula WHERE.
• Las funciones de columna en el SELECT devuelven un solo valor, por lo
que no se pueden recuperar junto con otras columnas.
• En el GROUP BY pueden aparecer columnas y funciones (ej. to_char,
to_number, nvl, ...), pero no funciones de columna.
• Cuando el SELECT se utiliza junto con un GROUP BY, las funciones de
columna devuelven tantos valores como grupos se formen, por lo que se
pueden recuperar junto con alguna de las columnas del GROUP BY.
• En el SELECT y en el HAVING solamente se pueden poner las columnas
que aparecen en el GROUP BY, y funciones de columna sobre el resto de
columnas de la tabla.
II18--Universitat Jaume I
11
Práctica 4: GROUP BY y HAVING
Número de facturas del cliente con menos facturas ...
TABLA FACTURAS
SELECT min( count(*) )
FROM facturas
GROUP BY codcli;
RESULTADO
Min( COUNT(*) )
1
CODFAC FECHA
CODCLI IVA
DTO
5
15
21
7
32
19
9
7
7
9
14
9
20
15
12
codcli
COUNT(*)
14
9
7
1
3
2
II18--Universitat Jaume I
03/11/01
14/02/01
16/05/01
21/08/01
01/01/01
05/12/01
16
16
16
7
0
12
15
12
Descargar