Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consulta sql maximos (https://www.clubdelphi.com/foros/showthread.php?t=58181)

franfl 11-07-2008 07:41:21

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

Neftali [Germán.Estévez] 11-07-2008 09:11:24

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

franfl 11-07-2008 14:04:33

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

RolphyReyes 11-07-2008 14:11:08

Saludos.

En Interbase/Firebird tienes SKIP, FIRST y ROWS.

franfl 11-07-2008 14:33:37

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

RolphyReyes 11-07-2008 14:51:28

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

franfl 11-07-2008 18:42:38

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

RolphyReyes 11-07-2008 18:47:26

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.

franfl 11-07-2008 21:08:20

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.

celades1 12-07-2008 09:49:29

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

franfl 12-07-2008 18:03:29

Muchas gracias funciona perfecto, y por lo menos arreglo un poco el problema del first, top,....
Muchisimas gracias por la ayuda

Gallosuarez 13-07-2008 19:10:23

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 :D)

franfl 14-07-2008 20:02:47

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


La franja horaria es GMT +2. Ahora son las 11:06:23.

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