Ver Mensaje Individual
  #7 (permalink)  
Antiguo 19/12/2007, 20:58
GsutavoDeLanus
 
Fecha de Ingreso: diciembre-2007
Mensajes: 110
Antigüedad: 16 años, 4 meses
Puntos: 1
Re: Consulta SQL Imposible?? Son solo 3 campos pero ya no se que hacer

Cita:
Iniciado por pragone Ver Mensaje
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.
La verdad que no se como agradecer tu esfuerzo por ayudarme!

Te cuento que gracias a tu consejo aprendí algo sobre las estructuras de las tablas.

Perdón por tardar en contestarte, es que estuve modificando el código y esto es algo que hago solo en mis ratos libres

Gracias a tu ejemplo pude adaptar estas tablas a mi foro PHPBB3 y solucionar varios detalles que con la otra estructura no sabía como hacer. La tabla clientes es mi tabla de usuarios de PHPBB3!!

Ya tengo todo como me dijiste.
Pero sigo con el mismo problema en la consulta 3.

En vez de mostrarme:

Nombre - Total puntos - Total compras
Gustavo -------- 10 ------- 5
Carlillo --------- 5 -------- 2

Me muestra:

Nombre - Total puntos - Total compras
Gustavo -------- 10 ------- 50
Carlillo --------- 5 -------- 10



EL total de compras me lo muestra multiplicado por el total de puntos. Algo similar me pasaba con la estructura anterior. Supongo que es porque al llamar a 3 columnas de tres tablas diferentes hace el producto cartesiano entre ellas.




Buscando y buscando no encontré la solución. Puede que la solución este en hacer sub-consultas o algo así?


Saludos!!


PD: Juro que si algún día logro que mi site me deje algún billetín te voy a enviar algunos verdes