SQL - script - agrupamiento

From Ibbddunq

Revision as of 02:15, 25 April 2009 by Carlos (Talk | contribs)

Contents

Empezamos con funciones

A las funciones que vimos hasta ahora les alcanza con mirar fila por fila:

  • DAY (=DAYOFMONTH) / MONTH / YEAR
  • operaciones matemáticas
  • IFNULL(valor1,valor que va si el valor1 es null)
  • ... alguna otra que se nos ocurra

Ahora, también tenemos estas funciones

  COUNT / SUM / AVG / MAX / MIN

que no se pueden evaluar para una fila sola, el MAX es el máximo de todas las filas del resultado, y así siguiendo.

P.ej.

  -- cantidad de actos y duracion total de una funcion
  select diaFn, horaFn, max(nroOrden), sum(duracion)
  from formaParte
  where diaFn = 20080615 and horaFn = 20;

o

  -- acto, grado de peligrosidad, cantidad de artistas que lo pueden hacer
  -- menor destreza, para el acto de los leones
  select nomActo, gradoPel, count(nomArt), min(destreza)
  from (acto natural join puedeParticipar)
  where nomActo = "leones";

(cómo obtener el artista de menor destreza ... para eso falta un rato)


Ahora sí, agrupamiento

Motivación

Ahora quiero

  • cantidad de actos y duración total de cada función,
  • cantidad de artistas/menor destreza de cada acto.

Concepto

Para eso tendría que separar (ponele) la tabla formaParte en pedacitos, cada pedacito son las filas de una función.

Dar la visión de "tabla de agrupados", o sea, visión conceptual de tabla donde cada fila representa un grupo de filas de la tabla original. Entonces de cada grupo sí tiene sentido el count, el min, el max, etc..

Destacar la diferencia entre agrupar y seleccionar (filtrar = seleccionar).

Sintaxis y primeros ejemplos

Ahora sí, sintaxis: GROUP BY, funciones que actúan sobre agrupados.

Ejemplos: <br/> 1

  -- cantidad de actos y duracion total de cada funcion
  select diaFn, horaFn, count(nroOrden), sum(duracion)
  from formaParte
  group by diaFn, horaFn
  order by diaFn, horaFn;

2

  -- cantidad de actos y duracion total de cada funcion que empieza a las 20 horas
  select diaFn, horaFn, count(nroOrden), sum(duracion)
  from formaParte
  where horaFn = 20
  group by diaFn, horaFn
  order by diaFn, horaFn;

3

  -- funcion con cantidad de actos de duracion mala ... facil!
  -- ... de aca ...
  select diaFn, horaFn, duracion, dmin, dmax, duracion-dmin, dmax-duracion
  from formaParte
      natural join acto
  where duracion-dmin < 0 or dmax-duracion < 0
  order by diaFn, horaFn, nroOrden;
  -- ... agrupamos ...
  select diaFn, horaFn, duracion, count(nroOrden)
  from formaParte
      natural join acto
  where duracion-dmin < 0 or dmax-duracion < 0
  group by diaFn, horaFn
  order by diaFn, horaFn, nroOrden;
Personal tools