Reportes + sql

Hola ...
Te escribo por que tengo dudas sobre un reporte que no logro realizar:
Cuento con tablas como clientes(id_cliente,nbre_cliente,ape_cliente); pedido(id_pedido,fecha_ped, id_cliente,efectivo,cheque,nota_cred); linea_pedido(id_linea,id_pedido,id_art,cantidad);articulo(id_art,descrip_art)
Necesito realizar un informe de los mejores clientes y que artículos compran..
Yo estoy realizando esta aplicación en 3 capas.
Uso cursores para devolver los datos pero no logro la combinación de todos o al menos no se ve eso en el informe.
El informe tiene que ser:
id_cliente ape_cliente nbre_cliente
                            id_art    desc_art  (todos los articulos que haya comprado sin que se repitan)
quizas este haciendo algo mal en el diseño del formulario pero no me doy cuenta que..
ni se como seleccionar por ejemplo que solo se muestren los 10 mejores clientes.
espero puedas ayudarme ..igual muchas gracias.
Este es un pedacito del código que estoy haciendo:
SELECT pedido.id_pedido,pedido.fecha_ped,pedido.id_cliente,SUM(pedido.efectivo+pedido.cheque+pedido.nota_c)tot,cliente.ape_cliente,cliente.nbre_cliente,linea_pedido.id_art,articulo.descrip_art;
FROM pedido,linea_pedido,articulo,cliente;
WHERE CTOD(TTOC(pedido.fecha_ped)) between CTOD(fdes) AND CTOD(fhas) AND pedido.id_pedido=linea_pedido.id_pedido AND pedido.id_cliente = cliente.id_cliente AND linea_pedido.id_art = articulo.id_art;
GROUP BY pedido.id_pedido,pedido.fecha_ped,pedido.id_cliente,pedido.efectivo,pedido.cheque,pedido.nota_c,cliente.ape_cliente,cliente.nbre_cliente,linea_pedido.id_art,articulo.descrip_art;
ORDER BY pedido.id_cliente,pedido.id_pedido,tot DESC INTO CURSOR crAux
SELECT crAux.id_cliente,SUM(crAux.tot)total,crAux.nbre_cliente,crAux.ape_cliente;
FROM crAux;
GROUP BY crAux.id_cliente,crAux.nbre_cliente,crAux.ape_cliente;
ORDER BY crAux.id_cliente,total DESC INTO CURSOR crAux1
Saludos
laura

1 respuesta

Respuesta
1
Disculpa la demora, estoy de vacaciones y tengo poco tiempo, pero me aburre un poco estar sin un computador así que encontré algo aquí, Bueno, viendo tu sql es un poco largo, y el group by esta mal según mi punto de vista, te daré un ejemplo de las tres tablas pero resumidas
clientes código, nombre
pedidosCab Ped_codigo, Ped_fecha, ped_cliente
pedidosItem item_codigo, item_producto, item_cant, item_precio
productos código, nombreProducto, precio
Un sql que me arroje cuantos pedidos hizo un cliente, en este ejemplo hablaremos de cantidad, pero si tu necesidad es otra solo cambiaras el campo por otro.
select nombre,NombreProducto,sum(item_cant) as cantidad from pedidos_cab,pedidos_item,clientes,productos
where ped_codigo=item_codigo and item_producto=producto.codigo and ped_cliente=clientes.codigo and between(ped_fecha,fecha1,fecha2) group by ped_cliente,item_producto  order by cantidad desc
Esto debe darte algo así
Cliente producto cantidad
Joser Mandioca 50
Juan Zapallo 49
Joser Naranjas 49
Pablo Zapallo 47
Y así sucesivamente, en este caso el group by es quien controla el SUM(), es decir al poner group by ped_cliente, item_producto estamos diciéndole a fox que sume por cada cliente y por cada producto, por eso le tenemos a Joser en dos oportunidades pero con productos diferentes, si haces group by ped_cliente solamente tendrías una sola ocurrencia con todos los clientes, así joser aparecerá conel valor 99, en este caso el campo nombreProducto no tiene sentido, tendrá un valor pero no seria real, tal vez tenga el ultimo producto que utilizo para el calculo, seri así
Joser 99
Juan 49
Pablo 47
COmo ves, todo depende del group by, el order le puse DESC para que ponga primero los mas grandes, asi si decides hacer una estadisticas puede reportear los primero 100 o solamente aquellos que alcanzaron mayores a 50, por ejemplo
repor form xx next 100
o
repor form xx for canti>49
Es lo que entendí, disculpa si fui para otro lado, pero cualquier duda me avisas.
Hola:
Desde ya muchas gracias por tu colaboración me ha sido de gran ayuda.. ya he logrado que mis reportes funciones.
Mil veces más gracias.
Saludos Laura.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas