Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Seleccionar el MAX de un COUNT (https://www.clubdelphi.com/foros/showthread.php?t=60596)

vejerf 07-10-2008 12:48:11

Seleccionar el MAX de un COUNT
 
Hola amigos,

Soy un poco novatillo en esto del SQL y para aprender estoy haciendo un ejemplo con una base de datos de una librería. Tengo tres tablas:
libros: registro,titulo,escritor,pais...
compras: registro,id_libro,id_comprador
compradores: registro,nombre,domicilio...

La cosa es que estoy intentando sacar el mayor número de libros vendidos de un país. Para ello hago lo siguiente:
Código SQL [-]
SELECT pais,count(pais) as cuenta FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais order by cuenta desc;
Con esto consigo obtener un listado de países y de los número de libros vendidos por país ordenados de forma descendente. Pero no consigo lo q quiero que es obtener el país más vendedor. He intentado aplicar algo como MAX(COUNT(pais)) pero no funciona.
¿Alguien que me saque de dudas?
Muchas gracias!!!

Caro 07-10-2008 13:01:48

Hola vejerf, sobre tu consulta podrías aplicar First o Top dependiendo de la BD que uses, para obtener el primer registro, así como esta tu consulta el primero sería el que tiene el Count mas alto.

Código SQL [-]
SELECT first 1 pais,count(pais) as cuenta FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais order by cuenta desc

O también

Código SQL [-]
Select Max(cuenta)
From (SELECT pais,count(pais) as cuenta FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais order by cuenta desc)

Saluditos

vejerf 07-10-2008 13:10:02

No me funciona :(
 
Gracias por tu pronta respuesta Caro, pero la cosa es que no funciona con ninguna de las dos soluciones. Parece que no me reconoce ninguna de las dos palabras claves que me das ni first ni top.

Uso una base de datos MySQL.

Gracias de todas formas

coso 07-10-2008 13:18:05

creo que con
Código SQL [-]
SELECT pais,count(pais) as cuenta, max(cuenta) as Maximo FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais order by cuenta desc;

tendras el maximo cuenta (numero de libros vendidos, en teoria) por pais, no?

Cita:

el mayor número de libros vendidos de un país
no hay un mayor numero de libros vendidos por pais :confused::confused:...solo un numero de ventas, total y unico, por pais. cuenta te dara ese numero. Creo que el error lo tienes en lo que estas buscando, creo que seria el mayor numero de ventas por libro y por pais. Corrigeme si me equivoco, y entonces la sentencia cambia bastante.

Caro 07-10-2008 13:19:15

Hola de nuevo, en mysql tienes que utilizar Limit.

Código SQL [-]
SELECT pais,count(pais) as cuenta FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais order by cuenta desc
Limit 1;

Saluditos

vejerf 07-10-2008 13:29:09

Caro ahora sí que funciona... Muchas gracias ;)...
Coso, quizás no expliqué correctamente lo que buscaba.
Lo intento de nuevo.
Tengo una tabla de libros con campos como titulo, autor o pais, es decir, asociamos el libro a un pais según su autor.
Por otra parte tengo la tabla compras que me relaciona un comprador con un libro comprado. Entonces en esta tabla cada registro podemos decir que equivale a la venta de un libro y ese libro lo teníamos asociado a un país.
Lo que buscamos es el "país que más ventas ha tenido". Lo pongo entre comillas porque en realidad lo que se venden son los libros asociados a un país.
Sé que es enrevesado pero es lo q me pedían :p...
Espero haberme explicado un poco :confused::confused::confused:
Gracias a los dos!!!

Caro 07-10-2008 13:32:42

Hola coso, creo que esta parte daría error

Cita:

Empezado por coso (Mensaje 318571)
SELECT pais,count(pais) as cuenta, max(cuenta) as Maximo FROM

talvez podría ser.

Código SQL [-]
Select Max(cuenta)
From (SELECT pais,count(pais) as cuenta FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais order by cuenta desc)

Saluditos

coso 07-10-2008 13:36:40

es posible caro, lo escribi de memoria y sql no es mi fuerte :rolleyes:. Gracias por la correccion.

coso 07-10-2008 13:37:54

Vamos, lo que buscabas era el numero de ventas del pais con mas ventas, no? Si, creo q si, entendido pues ;) un saludo

vejerf 07-10-2008 13:55:06

Pues si eso era lo que buscaba :o... ´
Por otra parte, la sentencia que propones me da error. Ya la había probado antes, pero me da un error y me dice que cada tabla debe tener su propio alias o algo así Caro

Caro 07-10-2008 14:16:23

Cita:

Empezado por vejerf (Mensaje 318578)
Por otra parte, la sentencia que propones me da error. Ya la había probado antes, pero me da un error y me dice que cada tabla debe tener su propio alias o algo así Caro

Si te refieres a lo ultimo que puse entonces aumentale su Alias y ya no sería necesario hacer el Order by.

Código SQL [-]
Select Max(cuenta)
From (SELECT pais,count(pais) as cuenta FROM 
(libros LEFT JOIN compras ON libros.registro=compras.id_libro) 
WHERE compras.registro IS  NOT null 
group by pais) Tabla

Saluditos

vejerf 07-10-2008 15:23:02

Perdón por abusar de la confianza... pero ahora con esta última sentencia pues sí obtengo el max(cuenta) que es lo que buscaba... pero no puedo obtener el país. Pensé que sería tan sencillo como:
Código SQL [-]
Select pais,Max(cuenta)From (SELECT pais,count(pais) as cuenta FROM (libros LEFT JOIN compras ON libros.registro=compras.id_libro) WHERE compras.registro IS  NOT null group by pais) Tabla
La cosa es que así no funciona... ¿por qué?


La franja horaria es GMT +2. Ahora son las 12:51:18.

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