Duda SQL con tablas relacionadas y selects anidados para saber el registro

vuelvo a tener problemas con una consulta sql Tengo una tabla Fabricante(cod_fabricante, nombre,pais) y otra Juguetes(cod_juguete,...

La FAQ Duda SQL con tablas relacionadas y selects anidados para saber el registro tiene

Pertenece a la categoría:
Pregunta
vuelvo a tener problemas con una consulta sql


Tengo una tabla Fabricante(cod_fabricante, nombre,pais)
y otra Juguetes(cod_juguete, cod_fabricante, descripción, precio, edad, stock)


Me piden al nombre del fabricante del cual existe la mayor cantidad de juguetes en una juguetería, pero no logro hacer la consulta sin el empleo de tablas auxiliares, y no me dejan utilizar éstas.


¿Alguien podría ayudarme? muchas gracias!
Respuesta de Alexander Vega
Hola, sería asi:



NOTA: coloque el AS por si lo haces en Access en otros gestores de
Base de Datos no hace falta colocarlo para crear el alias.
Importante: es necesario el IN que esta en el SELECT principal porque
puede haber mas de un fabricante con la misma cantidad de juguetes (y
que esta sea la cantidad maxima que existe)...



SELECT *
FROM FABRICANTE AS A
WHERE a.cod_fabricante in (SELECT
COD_FABRICANTE
FROM
(SELECT B.COD_FABRICANTE, COUNT(*) AS CANTIDAD
FROM FABRICANTE B, JUGUETES C
WHERE B.COD_FABRICANTE = C.COD_FABRICANTE
GROUP BY B.COD_FABRICANTE
HAVING COUNT(*) = (SELECT MAX(CANTIDAD) FROM (SELECT COUNT(*) AS CANTIDAD
FROM FABRICANTE
E, JUGUETES F
WHERE
E.COD_FABRICANTE = F.COD_FABRICANTE
GROUP BY E.COD_FABRICANTE))))



Saludos que sea de gran ayuda,

Volver al árbol de categoríasVolver al árbol de categorías

Comentarios

David Segoviano

16/1/2008
Hola, yo opino que hay una solucion un poco menos compleja.

SELECT F.cod_fabricante, F.nombre, SUM(J.stock) AS cant_jug FROM Fabricante AS F INNER JOIN Juguetes AS J ON F.cod_fabricante=J.cod_fabricante GROUP BY F.cod_fabricante ORDER BY cant_jug DESC LIMIT 0,1

Claro hay que revisar que tabla tiene menos registros para acomodar el JOIN para que sea optimo.

Aqui lo exlico:
-> seleccionas los campos que te interese conocer.
-> se hace la interseccion de las tablas
-> se hace una agrupacion de registros en el campo llave principal. (esto le da sentido al sum de stock o a un count de registros) para sacar el total de juguetes de cada fabricante
-> ordenamos por el contador en orden desendente
-> y limitamos los resultados a 1 desde el registro 0

Espero te sirva.
Exito.

fredy rua

17/1/2008
Para hacer esta consulta puedes trabajar con la funcion max para consultar el maximo valor agrupado por nombre el cual tomarias de la tabla de fabricantes, la clausula top 1 te toma el primer registro de la consulta y darle un order by desc, aca te envio el codigo espero te sirva. Feliz dia.

SELECT TOP 1 nombre
FROM Fabricante AS F
INNER JOIN Juguetes AS J
ON F.cod_fabricante = J.cod_fabricante
GROUP BY nombre
ORDER BY MAX(stock) DESC

fredy rua

17/1/2008
Esta seria otra manera de hacerlo:
SELECT TOP 1 nombre
FROM Fabricante AS F
INNER JOIN Juguetes AS J
ON F.cod_fabricante = J.cod_fabricante
ORDER BY stock DESC

alex

28/5/2009
TAMBIEN PUEDE INTENTAR LA SIGUIENTE CONSULTA
SELECT F.COD_FABRICANTE, F.NOMBRE, F.PAIS, SUM(J.STOCK) FROM FABRICANTE F
INNER JOIN JUGUETES J ON F.COD_FABRICANTE=J.COD_FABRICANTE
WHERE HAVING SUM(STOCK)=
SELECT MAX(TOTAL) FROM (
(SELECT COD_FABRICANTE, SUM(STOCK) TOTAL FROM JUGUETES
GROUP BY COD_FABRICANTE, STOCK)))
GROUP BY F.COD_FABRICANTE, F.NOMBRE,F.PAIS, J.STOCK

julian

29/1/2010
Solicitud respuesta
Hola saludos

Estuve haciendo un curso de SQL en Cádiz y me enviaron a realizar ese ejercicios dentro de una cantidad de ejercicios ya pude ver que da ti también ya que es la segunda pregunta de esa lista de ejercicios.

Yo la tengo realizada, pero no sé si está bien podrías facilitarla para comparar

PD: La academia cerró y me dejo sin saber el resultado.

Un saludo y gracias de antemano.

tiberiusp

13/9/2011
SQL Standar
las soluciones que utilizan ORDER BY no son estandar ya que "top 1" sirve en SQL Server y "limit" en MySQL. Una solucion sería:

select f.cod_fabricante, f.nombre as 'FABRICANTE',total
from fabricante as f inner join ( select sum(stock) as total,cod_fabricante from juguetes group by cod_fabricante ) as j
on j.cod_fabricante = f.cod_fabricante
where total = (select max(total) from (select sum(stock) as total ,cod_fabrica
from jueguetes group by cod_fabrica) as d )

sl2.

Cooler O´Connor

27/3/2012
Problema en query
Hola tengo duda en como realizar un query, les platico lo q necesito a ver si es posible: Necesito saber el numero de veces q un usuario ha entrado al sistema, al parecer no suena tan dificil pero el problema es que los usuarios estan repetidos, para esto ya tengo un query que m devuelve los usuarios sin repetir q han ingresado al sistema. Este es el query:

select DISTINCT(CardID) as CREDENCIAL
from BitacoraMembresias
where Action = 1
order by CardID

El resultadpo es:
CardID
2010052500004
2010052500005
2010072100001

pero el resultado q necesito es el siguiente:

CardID Visitas
2010052500004 10
2010052500005 5
2010072100001 4

Espero m puedan ayudar ...

Saludos
FAQ relacionadas

Para ver más FAQ relacionadas accede a las categorías:

Volver al árbol de categoríasVolver al árbol de categorías