42 - Cláusulas compute y compute by |
Las cláusulas "compute" y "compute by" generan totales que aparecen en columnas extras al final del resultado.
Produce filas de detalle y un valor único para una columna.
Se usa con las funciones de agrupamiento: avg(), count(), max(), min(), sum().
La sintaxis básica y general es la siguiente:
select CAMPOS from TABLA compute FUNCION(CAMPO);
El campo que se coloque en la cláusula "compute" debe estar incluida en la lista de campos del "select".
Para ver todos los datos de los visitantes y el promedio del monto de compra de nuestra tabla "visitantes":
select *from visitantes compute avg(montocompra);
Produce la misma salida que las siguientes 2 sentencias:
select *from visitantes; select avg(montocompra) from visitantes;
En una misma instrucción se pueden colocar varias cláusulas "compute":
select edad,ciudad,montocompra from visitantes compute avg(edad),sum(montocompra);
"Compute by" genera cortes de control y subtotales. Se generan filas de detalle y varios valores de resumen cuando cambian los valores del campo.
Con "compute by" se DEBE usar también la cláusula "order by" y los campos que se incluyan luego de "by" deben estar en el "order by". Listando varios campos luego del "by" corta un grupo en subgrupos y aplica la función de agregado en cada nivel de agrupamiento:
select nombre,ciudad,provincia from visitantes order by provincia compute count(provincia) by provincia; select nombre,ciudad,provincia from visitantes order by provincia,ciudad compute count(provincia) by provincia,ciudad;
Los campos que aparecen luego de la cláusula "compute by" DEBEN ser idénticos a un subconjunto de los campos que aparecen después de "order by" y estar en el mismo orden. Si la cláusula "order by" tiene los siguientes campos:
... order by a,b,c...
la cláusula "compute by" puede incluir los siguientes subconjuntos de campos:
... compute ... by a... o ... compute ... by a,b... o ... compute ... by a,b,c...
En una misma instrucción se pueden colocar varias cláusulas "compute" combinadas con varias cláusulas "compute by":
select *from visitantes order by provincia,ciudad compute avg(edad), sum(montocompra) compute avg(montocompra),count(provincia) by provincia,ciudad;
El resultado de la consulta anterior muestra el promedio de la compra y la cantidad al final de cada subgrupo de provincia y ciudad (compute by) y el promedio de las edades y el total del monto de compras de todos (compute).
Los tipos de datos ntext, text e image no se pueden incluir en una cláusula "compute" o "compute by".