Sql group by en from.

Hola experto,

Te cuento un poco:

Tabla 1: revisión

SQL: select id_revision, MAX(fecha) from revisión group by id_revision

Con este SQL obtengo las ultimas revisiones de cada equipo pero ahora necesito realizar búsquedas pero solo tengo dos campos de búsqueda, no puedo poner más por que se duplica la información.

Si añado más campos en el "group by" y "select" ya no me aparecen un unico registro por cada revisión, se duplican los datos.

La tabla revisión tiene los campos: id_revision, id_equipo, fecha, referencia, etc estos son los más importantes.

He pensado en esta opción para realiza búsquedas desde formulario Web atacando dicha consulta. Las opciones del buscador sería el fabricante y rango de fecha.

SQL Tablas: equipo, fabricante, revisión

SELECT equipo.id_equipo fabricante.nombre, revision.fecha

FROM equipo, fabricante, revisión, (select id_revision, MAX(fecha) from revisión group by id_revision) rev

WHERE

equipo.id_equipo = revision.id_equipo AND

equipo.id_fabricante = fabricante.id_fabricante AND

revisión.id_revision = rev.id_revision AND

rev.fecha > '01/01/2012';

Esta opción es la más correcta o realmente así no va funcionar....

Mañana probaré si funciona.

Gracias, un saludo.

1 Respuesta

Respuesta
1

Yo creo que la mejor forma es ponerlo como Subselect, obteniendo la fecha mayor de la revisión y sacando esta revisión.

SELECT equipo.id_equipo, fabricante.nombre, revision.fecha
FROM equipo, fabricante, revision
WHERE
equipo.id_equipo = revision.id_equipo AND
equipo.id_fabricante = fabricante.id_fabricante AND

and revision.fecha =
(select MAX(fecha) from revision rev2 where

     revision.id_revision = rev2.id_revision AND
      rev2.fecha > '01/01/2012');

Hola Javier, gracias por tu respuesta,

he modificado un poco el SQL añadiendo más tablas que ayer (revision = verificacion)

SELECT
equipo.id_equipo,
equipo.numero_control,
equipo.modelo,
equipo.n_serie,
equipo.periodo_calibracion,
equipo.cliente,
tipo_equipo.nombre,
verificación.numero_informe,
verificación.id_verificacion,
fabricante.nombre as fab,
to_char(equipo.fecha_cal_recomendada,'yyyy-mm-dd') as f3,
verificación.fecha
FROM equipo, tipo_equipo, fabricante, verificación
WHERE
equipo.id_tipo_equipo=tipo_equipo.id_tipo_equipo AND
equipo.id_fabricante=fabricante.id_fabricante(+) AND
equipo.id_equipo=verificación.id_equipo AND
verificación.fecha in (select MAX(fecha) from verificación ver2 where
verificación.id_verificacion = ver2.id_verificacion AND ver2.fecha > '01/01/2011')

Le problema es que si existe más verificaciones en el año 2011 por equipo aparecen, solo necesito la más actual.

Gracias por tu rápida respuesta.

Un saludo.

Sergio.

Si te entendido. Debería que dar así:

SELECT
equipo.id_equipo,
equipo.numero_control,
equipo.modelo,
equipo.n_serie,
equipo.periodo_calibracion,
equipo.cliente,
tipo_equipo.nombre,
verificación.numero_informe,
verificación.id_verificacion,
fabricante.nombre as fab,
to_char(equipo.fecha_cal_recomendada,'yyyy-mm-dd') as f3,
verificación.fecha
FROM equipo, tipo_equipo, fabricante, verificación
WHERE
equipo.id_tipo_equipo=tipo_equipo.id_tipo_equipo AND
equipo.id_fabricante=fabricante.id_fabricante(+) AND
equipo.id_equipo=verificación.id_equipo AND
verificación.fecha in (select MAX(fecha) from verificación ver2 where
verificación.id_verificacion = ver2.id_verificacion AND ver2.fecha > '01/01/2011'

AND verificacion.id_equipo = ver2.id_equipo)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas