Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/11/2009, 02:46
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Optimizar consulta

Hola,

En la descripción de tu modelo de datos me falta alguna tabla y me sobra otra.

La tabla Clientes, dices que los datos del cliente los tienes junto con los de la orden, esto seria un error de diseño ya que te obliga a repetir los datos del cliente para cada orden que este haga, mas adelante en tu post hablas de una tabla clientes....pero en el query que nos pones no lausas...?!?!

Por otro lado tienes una tabla

Cita:
ORDENES TOTAL ot (aqui guardo el precio total de la orden)
la que sugiere que deberia existir una ordenesDetalle con los datos que conforman ese total.

En principio la tabla total no haria falta puesto que el total puedes calcularlo a partir del detalle.

Debes seguir el princio de guardar totdos los datos unicos de una orden en la tabla Ordenes (la fecha de alta o inicial és un dato unico) y aquellos datos que no sean unicos (fechas de modificación, detalle del pedido...) en otra tabla.

Por tanto vamos a clarificar

ORDENES
idOrden
idCliente
fechaAlta
...
(aqui se guardan los datos de la orden, incluida fecha de alta o creació, otros campos fechaBaja... el total yo no lo pondria)

CLIENTES
idCliente
nombre
apellido
....

ORDENES HISTORIAL

idOrdenHist
idOrden
fecha
....
(aqui fecha a fecha el historial de la orden, o sea cuando fue realizada la orden, a media que la orden se apruebe o sufra otras modificaciones, se ira guardando una fecha para la modificacion realizada)

ORDENES_DETALLE

idOdernesDetalle
idOrden
descripcion
precio
...

(guardará los detalles de la orden, en especial los valores que deben formar el total de la orden, precio....)

Código sql:
Ver original
  1. SELECT COUNT(*) AS nordenes
  2. FROM ordenes o1
  3. WHERE o1.idcliente=X

esto nos da el numero de ordenes del cliente con id=X

Código sql:
Ver original
  1. SELECT SUM(od.precio) AS total
  2. FROM OrdenesDetalle od
  3. WHERE od.idOrden=Y

esto nos da el total de la orden con id=Y


Luego

Código sql:
Ver original
  1. SELECT
  2.   o.orden_id,
  3.   o.cliente_id,
  4.   c.nombre,
  5.   c.apellido,
  6.   (SELECT SUM(od.precio) AS total
  7.           FROM OrdenesDetalle od
  8.           WHERE od.idOrden=o.orden_id) AS total,
  9.   (SELECT COUNT(*) AS nordenes
  10.               FROM ordenes o1
  11.                     WHERE o1.idcliente=o.cliente_id) AS count_orden,
  12.   o.fechaAlta AS fecha
  13. FROM Ordenes o
  14.             INNER JOIN clientes c
  15.                         ON o.idCliente=c.idCliente

esto nos da una lista de ordenes orden_id, Cliente_id, Nombre, Apellido, total, count_orden, fecha que creo que es lo que buscas...

Quim