Ver Mensaje Individual
  #21 (permalink)  
Antiguo 11/12/2012, 09:34
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Procedimientos almacenados ayud4

El principal problema que te veo es que pierdes de vista lo que realmente te piden, y por ello te pones a buscar cosas que no están relacionadas.
El ejercicio en realidad es simple:
Mostrar los clientes que hayan comprado el plato más caro de un determinado periodo de tiempo.
Hay tes cosas que debes determinar para resolverlo:
1) La lista de clientes que compraron algo en ese período.
2) La lista de platos comprados durante ese período.
3) El plato más caro vendido en ese período.
No importa si es el mas caro de todos, o cómo se llama el plato, ni tampoco interesa en la consulta la cantidad de veces que cada cliente compró ese mismo plato. Ninguna de esas cosas se está preguntando en ese caso.
Por eso digo que pierdes de perspectiva lo que realmente te preguntan.
En primer lugar, veamos la lista de clientes:
Código MySQL:
Ver original
  1. SELECT DISTINCT c.cod_cliente, c.nombre
  2. FROM factura F INNER JOIN cliente ON f.cod_cliente = c.cliente;
Eso determina los clientes a los que se facturó, sin importar cuándo fue.
Código MySQL:
Ver original
  1. SELECT DISTINCT c.cod_cliente, c.nombre
  2. FROM factura F INNER JOIN cliente ON f.cod_cliente = c.cliente;
  3. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta;
Eso devuelve sólo las que corresponden a un rango de fechas (eso ya lo habías hecho, ¿por qué no lo tomaste de nuevo?).
Si quieres saber el listado de platos, necesitas el detalle de la factura:
Código MySQL:
Ver original
  1. SELECT DISTINCT c.cod_cliente, c.nombre
  2. FROM factura F INNER JOIN cliente ON f.cod_cliente = c.cliente;
  3.  INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  4. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta;
Con el detalle de lafactura estás obteniendo (aunque no es necesario mostrarlo porque no lo pide) el co_plato, por lo que bien puedes buscar uno sólo o muchos.
Un sólo plato
Código MySQL:
Ver original
  1. SELECT DISTINCT c.cod_cliente, c.nombre
  2. FROM factura F INNER JOIN cliente ON f.cod_cliente = c.cliente
  3.     INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  4. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta
  5.     AND d.cod_plato = 2;
Más de un plato:
Código MySQL:
Ver original
  1. SELECT DISTINCT c.cod_cliente, c.nombre
  2. FROM factura F INNER JOIN cliente ON f.cod_cliente = c.cliente
  3.     INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  4. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta
  5.     AND d.cod_plato IN(2, 34, 6, 12, 1890);
Ahora bien, debemos determinar el código de pato correspondiente al plato más caro, y eso se puede hacer de dos formas:
Código MySQL:
Ver original
  1. SELECT DISTINCT d.codigo_plato
  2. FROM factura f INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  3. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta
o bien:
Código MySQL:
Ver original
  1. SELECT DISTINCT d.codigo_plato
  2. FROM factura f INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  3. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta
  4. HAVING d.costo =MAX(d.costo)

Vamos a usar la primera de ambas:
Código MySQL:
Ver original
  1. SELECT DISTINCT c.cod_cliente, c.nombre
  2. FROM factura F INNER JOIN cliente ON f.cod_cliente = c.cliente
  3.     INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  4. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta
  5.     AND d.cod_plato =
  6.         (SELECT DISTINCT d.codigo_plato
  7.         FROM factura f INNER JOIN detalle_factura d ON f.nfactura = d.nfactura
  8. WHERE f.fecha BETWEEN fecha_desde AND fecha_hasta
  9.         ORDER BY costo DESC
  10.         LIMIT 1);

Aclaremos que esta no es la única forma de solucionar algo por el estilo. Pero no podrás solucionar ninguna si no te pones a razonar las consultas desglosando las condiciones que deben cumplir. Por eso te pedía que lo planearas por partes.

Ahora intenta hacer lo mismo (el modo de razonarlo, no el ejercicio) con el otro caso, por ti mismo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)