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