Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-12-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 21
Espartaco Va por buen camino
Consulta Complicada

Hola amigos, otra vez tengo un problema, he titulado este hilo asi porque la verdad es que no se como titularlo, en realidad no se si debe ir en este foro o en el de impresion. Voy a intentar explicar el problema que es un poco enrevesado.

En primer lugar trabajo en Delphi 5, con el QReport que trae, y con tablas paradox.

Tengo una tabla que se estructura asi:

NMAQUINA = numero de maquina (INTEGER)
FECHA = fecha de la venta (DATE)
PRODUCTO = nombre del producto (STRING)
CANTIDAD = unidades vendidas (INTEGER)

Ahora viene el problema, necesito sacar un listado (o consulta) de forma que por cada linea de listado debo tener:

PRODUCTO1 PRODUCTO2 PRODUCTO3 PRODUCTO4...
NMAQUINA CANTIDAD1 CANTIDAD2 CANTIDAD3 CANTIDAD4 ...

CANTIDAD1 representa la suma de ventas del PRODUCTO1
CANTIDAD2 representa la suma de ventas del PRODUCTO2 ....
Para la maquina NMAQUINA dentro de un margen de fechas.
Los PRODUCTO1, PRODUCTO2... los elijo previamente.


El problema es que no se como hacer la consulta de manera que me genere una tabla con los registros de esta forma, no tengo problemas para hacer una consulta que me de un registro con la suma de ventas por cada PRODUCTO (es decir un registro por cada PRODUCTO), pero despues tengo el problema que no se como poner en un report para que me salga de la forma que he puesto arriba, ademas creo que teniendo la consulta adecuada es mucho menos enrevesado para listar en report.

No se si me he explicado bien, he intentado algo con inner join, pero no entiendo muy bien este comando y no he conseguido nada mas que errores del SQL.

Gracias de antemano, espero me podais ayudar.
Responder Con Cita
  #2  
Antiguo 03-12-2007
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.087
Poder: 20
juanelo Va por buen camino
Que tal,

Yo te recomendaria que saques el reporte de la siguiente forma:

--------------------------------------
MAQUINA | PRODUCTO | CANTIDAD |
---------------------------------------
NMAQUINA | PRODUCTO1 | CANTIDAD1
NMAQUINA | PRODUCTO2 | CANTIDAD2
NMAQUINA | PRODUCTO3 | CANTIDAD3
NMAQUINA | PRODUCTO4 | CANTIDAD4

De esta forma con un simple sum y group by debe de salir el reporte.
Saludos
Responder Con Cita
  #3  
Antiguo 03-12-2007
hecospina hecospina is offline
Miembro
 
Registrado: oct 2007
Posts: 202
Poder: 19
hecospina Va por buen camino
En Qreport no he encontrado la forma de hacer un reporte de este tipo, fast report tiene un funcion que denomina datos cruzados y lo hace bien
Si el numero de referencia solo es 4, se podria generar el reporte con solo esas cuatro columnas pero si el numero de registros es variable es complicado
Te recomendari mirar fast report
Responder Con Cita
  #4  
Antiguo 04-12-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 21
Espartaco Va por buen camino
Gracias por responder tan pronto, os comento:

A juanelo:

De la forma que dices no tengo problema al obtenerlo, como indico al principio, pero luego no se como con group by conseguir poner en una sola linea(registro) los datos de diferentes productos. El sum creo que solo lo necesitaria para obtener los resultados que tu has expuesto, pero para lograr el resultado definitivo me parece que no hace falta, o yo no lo veo.

A hecospina:

Ya probe en otra ocasion utilizar fast report y tuve muchos problemas tanto para instalar como para utilizarlo, por falta de tiempo (pues me corre mucha prisa) no puedo seguir tu consejo, aunque muchas gracias por responder, en un futuro no muy lejano intentare investigar el funcionamiento de fast report. Si se te ocurre algo con SQL te lo agradeceria tambien.

Gracias a los dos. Un saludo.
Responder Con Cita
  #5  
Antiguo 05-12-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 20
Gabo Va por buen camino
Hola, no alcanzo a comprender cuál es tu problema realmente, ya que dices:

Cita:
no tengo problemas para hacer una consulta que me de un registro con la suma de ventas por cada PRODUCTO (es decir un registro por cada PRODUCTO),
Eso debería bastarte para generar n filas con la información de este tipo:

NMAQUINA CANTIDAD1 CANTIDAD2 CANTIDAD3 CANTIDAD4 ...

Ahora, si lo que quieres (y es lo que no alcanzo a entender bien ), es que te muestre los nombres de los productos en las columnas, esos los puedes obtener con otra consulta SQL. No tiene porqué ser la misma.

Otra manera de entenderlo:

¿O el problema es que no sabes generar las columnas?
Explicalo un poco, ya que no te entiendo bien, aunque es posible que sea yo el que esté "un poco espeso" esta mañana .
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #6  
Antiguo 05-12-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 21
Espartaco Va por buen camino
Con mucho gusto Gabo te explico mejor el problema, es probable que me haya enrevesado un poco al intentar ponerlo lo mas claro posible.

De todas formas, indagando en los libros de SQL que tengo, he podido aclarar lo que quiero, en realidad es convertir columnas en filas, es decir, yo hago una consulta para saber cuantas ventas ha tenido el PRODUCTO1, aqui no hay problema, pero en cambio si lo que quiero saber es la suma de dos productos en vez de uno, es decir TOTAL VENTAS DEL PRODUCTO1 Y TOTAL VENTAS DEL PRODUCTO2, la unica manera que se me ocurre de obtenerlo es haciendo dos consultas distintas, ya que en la tabla donde guardo los datos, hay un campo que contiene los productos, es decir, no tengo un campo para cada producto.

Si hago una consulta para cada producto (que seria posible) se me viene otro problema, y es que tengo que listar los datos de la forma en que los puse en el primer mensaje, y con Qreport no se como hacerlo.

Hay que tener en cuenta tambien que no todas las maquinas tienen los mismos productos. Para clarificar un poco este galimatias de productos te pongo a continuacion un ejemplo de como seria el listado a obtener:

Cita:
LISTADO DE VENTAS

Nº MAQUINA CAFE SOLO LECHE CHOCOLATE CORTADO
1 15 0 10 25
2 25 12 23 7
3 20 42 0 14
4 35 47 11 35
6 0 8 4 15
y asi hasta completar hasta aprox. 400 maquinas y un total de 10 productos diferentes.
Nota: no sale tabulado, pero es que no puedo introducir tabulaciones, pero se entiende que cada columna de numeros corresponde a una columna de la cabecera.

En los libros que he consultado lo hace utilizando sentencias case y bucles when etc., pero resulta que esta para SQL Server y si lo intento en mi ordenador me da error, entiendo que es porque yo tengo el SQL que viene con Delphi 5.

Espero haber aclarado un poco mas el tema, aunque me haya explayado un poco. Estoy haciendo pruebas utilizando consultas por producto y luego grabandolas en una tabla temporal, pero tarda mucho tiempo en hacerlo y no es factible para mi cliente (que por otro lado lo necesita con urgencia).

Muchas gracias por ayudarme, espero que a alguno de ustedes se le ocurra algo, yo no dejo de intentarlo.

Última edición por Espartaco fecha: 05-12-2007 a las 13:49:35. Razón: edito para poner el listado bien
Responder Con Cita
  #7  
Antiguo 05-12-2007
hecospina hecospina is offline
Miembro
 
Registrado: oct 2007
Posts: 202
Poder: 19
hecospina Va por buen camino
Hola
Si el numero de productos es fijo, como dices 10
podrias hacer una consulta por cada uno de ellos usando la sentencia union all y te da como respuesta un solo dataset

select maquina, dato1,dato2,dato3...
from tabla
where codigo='xx'
union all
select maquina, dato1,dato2,dato3...
from tabla
where codigo='yy'
union all
select maquina, dato1,dato2,dato3...
from tabla
where codigo='xx' ...

En qreport yo logre hacer una de ventas para doce meses, el problema es que es estatico
si te sirve esta solucion puedo detallarla mejor
ojo depende totalmente que el numero de referencias sea fijo
Responder Con Cita
  #8  
Antiguo 05-12-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 20
Gabo Va por buen camino
Código:
 
LISTADO DE VENTAS

Nº MAQUINA CAFE SOLO LECHE CHOCOLATE CORTADO
         1        15     0        10      25
         2        25    12        23       7
         3        20    42         0      14
         4        35    47        11      35
         6         0     8         4      15
Yo utilizo un procesador de textos con fuente Courier New y luego pego el resultado aquí entre etiquetas CODE.
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.

Última edición por Gabo fecha: 05-12-2007 a las 17:03:39.
Responder Con Cita
  #9  
Antiguo 05-12-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 20
Gabo Va por buen camino
Dejame ver si he entendido:

Tienes una sola tabla con esta estructura:

NMAQUINA = numero de maquina (INTEGER)
FECHA = fecha de la venta (DATE)
PRODUCTO = nombre del producto (STRING)
CANTIDAD = unidades vendidas (INTEGER)

Y quieres tener un informe donde en las columnas estén los productos y en las filas las máquinas.

Yo haría dos consultas, una para generar los encabezados de columnas donde obtengo todos los productos ordenados por su nombre. Me aprovecho del evento OnPrint de las TQRLabel y su propiedad Value.

La segunda consulta (los datos por fila) la ordeno por los productos de la misma forma y la agrupo por NMAQUINA.
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #10  
Antiguo 07-12-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 21
Espartaco Va por buen camino
Gracias de nuevo, a ver
para hecospina, los productos pertenecen al mismo campo como muestro a continuacion:
Código:
CONTENIDO DE LA TABLA
 
NMAQUINA   FECHA      PRODUCTO       CANTIDAD
  3      21/11/07     CAFÉ SOLO         10
  5      15/11/07     CHOCOLATE          3 
  3      22/11/07     CHOCOLATE          5
  3      22/11/07     CORTADO            7
  4      16/11/07     LECHE              6
  5      15/11/07     CORTADO            2
  3      23/11/07     LECHE              3
ETC…
Para Gabo, no entiendo muy bien lo que me propones, creo que no se puede porque la tabla es como indico aqui, entonces no se como sacas una consulta con los totales por productos y maquinas.

saludos
Responder Con Cita
  #11  
Antiguo 07-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Para cambiar filas por columnas con paradox, están los decision Cube, échale un vistazo a la ayuda y a los componentes.

No podré dar más ayuda porque no los he usado. Espero te sirva

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 07-12-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 20
Gabo Va por buen camino
Cita:
Empezado por Espartaco Ver Mensaje

Para Gabo, no entiendo muy bien lo que me propones, creo que no se puede porque la tabla es como indico aqui, entonces no se como sacas una consulta con los totales por productos y maquinas.

saludos
Bueno, creo que lo que me comentas es respecto a la segunda consulta que te sugiero.

Se trata de realizar la sumatoria (SUM) del campo cantidad y luego agrupar (group by) por producto y maquina. Algo así como:

Código SQL [-]
SELECT PRODUCTO, NMAQUINA, SUM(CANTIDAD) FROM TABLA GROUP BY PRODUCTO, NMAQUINA
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #13  
Antiguo 08-12-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 21
Espartaco Va por buen camino
Gabo tengo que probar tu ejemplo, pero es que ahora no estoy en la oficina, en cuanto lo pruebe te digo.

Lepe he buscado el componente decision Cube en mi Delphi y no esta en la paleta, lo he buscado en la configuracion de la paleta y me aparece pero vacio de componentes. Tengo Delphi 5 Professional y no se si es que esta version no lo incluye.

Tambien me gustaria saber como usar una version mas moderna de SQL o SQL Server y donde puedo conseguirlo.

Gracias, quedo a la espera.
Responder Con Cita
  #14  
Antiguo 11-12-2007
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 21
Espartaco Va por buen camino
Hola de nuevo amigos, os cuento como he resuelto el problema,

cogiendo el ejemplo de Gabo y añadiendole la clausula ORDER BY NMAQUINA, consigo que la consulta me muestre lo siguente:

Código:
NMAQUINA   PRODUCTO   SUMA
    3      CAFÉ        25
    3      LECHE       60
    3      CHOCOLATE   10
    8      LECHE       25
    8      CHOCOLATE   14
   10      CAFÉ        32
   10      CAFÉ CORTO  16
   10      LECHE       22
   10      CHOCOLATE   15
Con estos datos en la consulta, me creo una tabla dinamicamente en la que los campos son NMAQUINA, CAFE, LECHE, CHOCOLATE, etc. y con un bucle voy grabando los datos en la tabla, con el bucle consigo que cuando cambia el nº de maquina me cree otro registro en la tabla y el resultado es

Código:
NMAQUINA   CAFÉ    CAFÉ CORTO    LECHE    CHOCOLATE
    3        25                    60         10
    8                              25         14
   10        32         16         22         15
Y ya solo tengo que hacer un report cogiendo los datos de la tabla dinamica, parece un poco enrevesado pero en realidad no lo es, y ademas es mas rapido de lo que yo creia, pues ademas acoto la consulta entre fechas, y con una tabla de unos 12000 registros, me tarda solo un par de segundos convertir las filas en columnas.

Si alguien quiere alguna aclaracion, que no dude en decirmelo y con mucho gusto se la facilito.

Gracias a todos por vuestra ayuda, me ha servido de mucho.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta complicada superhopi MS SQL Server 15 03-07-2006 23:53:59
Consulta Complicada tcp_ip_es SQL 2 09-06-2006 16:05:30
Consulta complicada Luciano M. SQL 6 01-12-2005 19:30:15
Consulta complicada cval SQL 4 21-09-2005 18:04:27
Complicada consulta mosorio SQL 3 12-08-2003 20:12:00


La franja horaria es GMT +2. Ahora son las 21:22:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi