Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
Consulta sql maximos

Hola
Tengo un problemilla con una consulta. Estoy haciendo unas estadisticas en builder para mi programa usando interbase, por ejemplo una consulta muy sencilla es seleccionar los clientes q mas compran en el gimnasio:

SELECT C.IDCLIENTE, NOMBRE, DNI, COUNT(IDVENTA) AS NUMVENTAS
FROM CLIENTE C INNER JOIN VENTA V ON C.IDCLIENTE = V.IDCLIENTE
GROUP BY C.IDCLIENTE,NOMBRE,DNI;

El problema es q cuando hay muchos clientes muestro a todos, entonces queria seleccionar por ejemplo solo a los 5 clientes q mas compran, y eso ya no lo se hacer pq tampoco tengo mucho nivel de sql. A ver si alguien me puede ayudar y no se me complica mucho.
Gracias
Un saludo
Responder Con Cita
  #2  
Antiguo 11-07-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Con la consulta que tienes, puedes ordenar (ORDER BY) por NUMVENTAS descendente (DESC) y usar un TOP para quedarte con los 5 primeros.

Algo así:

Código SQL [-]
SELECT  TOP 5
C.IDCLIENTE, NOMBRE, DNI, COUNT(IDVENTA) AS NUMVENTAS
FROM CLIENTE C INNER JOIN VENTA V ON  C.IDCLIENTE = V.IDCLIENTE
GROUP BY C.IDCLIENTE,NOMBRE,DNI
ORDER BY NUMVENTAS DESC
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 11-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
Muchas gracias, pero no me funciona, y por lo que vi en la ayuda del interbase, no existe esa funcion, nose si habra otra equivalente.
Un saludo
Responder Con Cita
  #4  
Antiguo 11-07-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Saludos.

En Interbase/Firebird tienes SKIP, FIRST y ROWS.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #5  
Antiguo 11-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
Buff, no se muy bien como usar esos operadores(first,row....). Buscando por internet encontre que interbase no tiene operadores especiales para limitar el tamaño de una consulta. A ver si alguien me puede ayudar en la consulta que os enseñe mas arriba.
Un saludo y mil gracias
Responder Con Cita
  #6  
Antiguo 11-07-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Saludos.

Cita:
Comenzado por franfl
Buscando por internet encontre que interbase no tiene operadores especiales para limitar el tamaño de una consulta
Esas directivas antes mencionadas se utilizan para limitar los registros del Select.

NO especificas que versión del motor estas utilizando, por ejemplo SKIP esta desde Interbase 6, FIRST en FireBird >= 1.5 y por ultimo ROWS en Interbase >= 6.5 y Firebird >= 2.

Ejemplos:
Código SQL [-]
 - SELECT SKIP 10 * FROM TABLA
- SELECT FIRST 10 * FROM TABLA
- SELECT * FROM TABLA
   ROWS 10
- SELECT * FROM TABLA
   ROWS 10 TO 100
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #7  
Antiguo 11-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
Yo utilizo el interbase 6.0, y no me permite ninguna de esas funciones, asi que no creo q pueda hacer nada, pero gracias por todo.
Un saludo
Responder Con Cita
  #8  
Antiguo 11-07-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Cool

Pues si tienes Interbase 6 (Open Source) puedes fácilmente migrar a FireBird 2.1 sin muchos contratiempos. Y así podrás obtener mayor estabilidad y velocidad con este motor.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #9  
Antiguo 11-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
El problemas es que es para el proyecto fin de carrera, y la tutora solo me deja en este interbase, que la verdad que me da mil problemas.
Quise poner una condicion para disminuir el numero de registros a mostrar:
SELECT C.IDCLIENTE,NOMBRE, DNI, COUNT(IDVENTA) AS NUMVENTAS
FROM ( CLIENTE C INNER JOIN VENTA V ON C.IDCLIENTE=V.IDCLIENTE)
WHERE NUMVENTAS > 1
GROUP BY NOMBRE,DNI,C.IDCLIENTE;

y me dice q la columna NUMVENTAS es desconocida, q yo creo q en otros programas funciona bien.
Muchas gracias a todos y perdonar pero es q es lo ultimo para terminar el proyecto.
Responder Con Cita
  #10  
Antiguo 12-07-2008
celades1 celades1 is offline
Miembro
 
Registrado: ago 2005
Posts: 116
Poder: 19
celades1 Va por buen camino
Hila

Código SQL [-]
SELECT C.IDCLIENTE,NOMBRE, DNI, COUNT(IDVENTA) AS NUMVENTAS
FROM ( CLIENTE C INNER JOIN VENTA V ON C.IDCLIENTE=V.IDCLIENTE) 
GROUP BY NOMBRE,DNI,C.IDCLIENTE
HAVING COUNT(IDVENTA)> 1 
ORDER BY 4 DESC

Saludos
Responder Con Cita
  #11  
Antiguo 12-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
Muchas gracias funciona perfecto, y por lo menos arreglo un poco el problema del first, top,....
Muchisimas gracias por la ayuda
Responder Con Cita
  #12  
Antiguo 13-07-2008
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Post Mejores Clientes...

Crea el siguiente procedimiento:

Código SQL [-]
create procedure MejoresClientes(Rango integer)
returns (IDCliente int, Nombre varchar(60), DNI varchar(20), CntVentas int) as
begin
  for select C.IDCLIENTE, NOMBRE, DNI, count(IDVENTA)
      from (CLIENTE C inner join VENTA V on C.IDCLIENTE = V.IDCLIENTE) 
      group by NOMBRE, DNI, C.IDCLIENTE
      having count(IDVENTA) > 0 
      order by 4 desc
      into :IDCliente, :Nombre, :CNI, CntVentas do
  begin
    suspend;
    Rango = Rango - 1;
    if (Rango = 0) then exit;
  end
end
Y lo llamas así:

Código SQL [-]
select * from MejoresClientes(10)

Saludos y nos platicas como te fue...
Gerardo Suárez Trejo. (Y si te sacas diez de calificación en la tesis: 5 para tí y 5 para mi )

Última edición por Gallosuarez fecha: 13-07-2008 a las 19:23:54.
Responder Con Cita
  #13  
Antiguo 14-07-2008
franfl franfl is offline
Miembro
 
Registrado: feb 2008
Posts: 88
Poder: 17
franfl Va por buen camino
Hola, perdona la tardanza pero como ya dije es que trabajo y hasta estas horas no tengo tiempo libre. No me va, me da un error de que no se puede crear el procedimiento, supongo que sera esta version del interbase que me da mil fallos, pero no te preocupes pq lo consegui arreglar con 'where'. No obstante guarde ese procedimiento para otras veces.
Muchas gracias por este magnifico foro y vuestra ayuda
un saludo
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
Realizar una consulta sobre los registros que devuelve otra consulta Borjaserrano Firebird e Interbase 12 01-10-2007 23:19:44
Consulta dentro de otra consulta judit25 Conexión con bases de datos 1 25-06-2007 15:52:15
Histograma. Obtener máximos y mínimos relativos Delphius Varios 7 16-04-2007 12:12:46
Maximos Carlex SQL 1 03-02-2005 19:23:53
consulta sobre consulta superhopi SQL 2 16-05-2003 19:01:47


La franja horaria es GMT +2. Ahora son las 16:32:55.


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