Ver Mensaje Individual
  #6 (permalink)  
Antiguo 17/12/2007, 15:18
Avatar de pragone
pragone
 
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Consulta SQL Imposible?? Son solo 3 campos pero ya no se que hacer

No hay problema Gustavo.

Primero que nada, te dirijo a la Wikipedia para más info sobre diseño de estructuras:
http://es.wikipedia.org/wiki/Normalizaci%C3%B3n_de_una_base_de_datos (Todavía no puedo colocar enlaces).... aunque es un poco teórico, leería por lo menos los tres pasos de normalización de una BD, lo que es un Modelo de Entidad-Relación y las definiciones como "Clave foránea".

Ahora bien, respecto a tu sistema, me imagino que tiene que ver con algo de compras (no me preguntes cómo... simplemente lo sé ), así que pensaría en la siguiente estructura:
Tabla 1: Cliente
id: integer auto_increment primary key (esta es la clave primaria de esta tabla, asigna un número único al cliente)
nombre: varchar(100)

Tabla 2: Puntos
id_cliente: integer // es el número de identificación del cliente que está ganando los puntos
fecha: timestamp // momento en el que le asignas los puntos
puntos: integer // la cantidad de puntos que le asignas
En esta tabla, la clave primaria sería compuesta (id_cliente y fecha)

Tabla 3: Compras
id: integer auto_increment primary key (esta es la clave primaria de esta tabla, asigna un número único a la compra)
id_cliente: integer // es el número de identificación del cliente que ha realizado la compra
monto: float // monto de la compra
fecha: timestamp // momento en el que se hace la compra.

Con esta estructura, las consultas que necesitas son:
1) Puntos por cliente:
SELECT cliente.nombre, SUM(puntos.puntos) FROM cliente LEFT JOIN puntos ON (cliente.id=puntos.id_cliente) GROUP BY cliente.nombre;
Beneficios de esta query con la que tenías:
- También te muestra los clientes que no tienen puntos
- Si quieres puedes agregar un WHERE indicando un rango de fechas para saber qué cliente ganó puntos en un período de tiempo específico

2) Compras por cliente: (Más de los mismo)
SELECT cliente.nombre, SUM(compra.monto) FROM cliente LEFT JOIN compra ON (cliente.id=compra.id_cliente) GROUP BY cliente.nombre
Beneficios, los mismos

3) Puntos y compras por cliente:
SELECT cliente.nombre, SUM(puntos.puntos), SUM(compra.monto) FROM cliente LEFT JOIN puntos ON (cliente.id=puntos.id_cliente) LEFT JOIN compra ON (cliente.id=compra.id_cliente) GROUP BY cliente.nombre;

Y listo. Verás que mientras mejor diseñada está la estructura más fácil es obtener la información que deseas.