Autor |
Mensaje |
Uciel
Nivel 6
Edad: 33
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
Hola, tengo la siguiente tabla:
CREATE TABLE ARTICULOS
(`codA` int, `nombre` varchar(15), `precio` int, `codF` int)
;
INSERT INTO ARTICULOS
(`codA`, `nombre`, `precio`, `codF`)
VALUES
(1, 'remera', 100, 1),
(2, 'zapatos', 600, 1),
(3, 'zapatillas', 650, 1),
(4, 'buso', 250, 2),
(5, 'campera', 300, 2),
(6, 'guantes', 20, 3),
(7, 'bufanda', 25, 4),
(8, 'gorro', 40, 4),
(9, 'camisa', 200, 4)
;
y quiero que me muestre los codigos de fabricante (codF) que fabrican la mayor cantidad de prendas.
A ojo puede verse que la salida es esta:
codF | max(prendas)
------------------------
1 | 3
4 | 3
¿Cual seria el codig SQL que me resuelve esa consulta?
Saludos!
|
|
|
|
|
|
|
|
|
jroman
Nivel 3
Registrado: 17 Ene 2012
Mensajes: 42
|
|
algo asi
select cod_fab ,max(prendas) from tabla
group by cod_fab
order by cod_fab; //esto no es necesario pero es para que quede ordenado por id
|
|
|
|
|
|
|
|
|
karajero
Nivel 8
Edad: 34
Registrado: 15 Nov 2009
Mensajes: 890
Carrera: Sistemas
|
|
jroman escribió:
|
algo asi
select cod_fab ,max(prendas) from tabla
group by cod_fab
order by cod_fab; //esto no es necesario pero es para que quede ordenado por id
|
Algo así es lo que decís:
select codF ,count(codF) as cantidad from ARTICULOS
group by codF
order by cantidad DESC
(lo podés probar acá: http://sqlfiddle.com/#!9/bd32a/21/0)
Igual lo ideal sería que limite los resultados al max de cantidad, pero si usás la función max te trae un sólo resultado. No sé cómo reemplazar esa función por algo que te traiga filas repetidas y evitando usar tantas subconsultas.
Lo mejor que pude hacer es esto que funciona, pero es una chanchada:
SELECT * FROM (
SELECT * FROM (
SELECT codF, count(codF) as cantidad
FROM ARTICULOS
GROUP BY codF
) AS subquery1
LEFT JOIN (
SELECT max(cantidad) AS maximo FROM (
SELECT codF, count(codF) AS cantidad
FROM ARTICULOS
GROUP BY codF
) AS sarasa
) as subquery2
ON subquery1.cantidad = subquery2.maximo
) as result
WHERE maximo is not null
http://sqlfiddle.com/#!9/bd32a/53/0
Quizás alguien traiga una solución mejor.
|
|
|
|
_________________
|
|
|
|
|
loonatic
Nivel 9
Edad: 32
Registrado: 16 May 2009
Mensajes: 1256
Carrera: Sistemas
|
|
Código:
|
select codF
from ARTICULOS
group by codF
having count(codF) >= ALL (select count(b.codF)
from ARTICULOS b
group by b.codF)
|
Primero te traés las cantidades de prendas fabricadas, después buscas los ID de los fabricantes que fabriquen igual o más cantidad.
Ojo con algo, el enunciado original no te pide que listes la cantidad fabricada, solo los ID.
|
|
|
|
|
|
|
|
|
SorLali
Nivel 9
Edad: 91
Registrado: 01 Jul 2009
Mensajes: 1205
Carrera: Informática y Sistemas
|
|
En el parcial, para un ejercicio parecido se me ocurrio lo siguiente:
Código:
|
select codF, count(*) from ARTICULOS group by codF order by count(*) desc limit 1;
|
Recuerdo que me levante a preguntar si limit esta permitido (no recuerdo si es estandar) aunque no recuerdo que me contestaron X-D
|
|
|
|
_________________ Foros-FIUBA o muerte
|
|
|
|
|
SorLali
Nivel 9
Edad: 91
Registrado: 01 Jul 2009
Mensajes: 1205
Carrera: Informática y Sistemas
|
|
SorLali escribió:
|
En el parcial, para un ejercicio parecido se me ocurrio lo siguiente:
Código:
|
select codF, count(*) from ARTICULOS group by codF order by count(*) desc limit 1;
|
Recuerdo que me levante a preguntar si limit esta permitido (no recuerdo si es estandar) aunque no recuerdo que me contestaron X-D
|
Perdon, lo anterior solo sirve si solo un fabricante frabrica la mayor cantidad de articulos. Ya recorde como me sugirieron que lo resuelva durante la cursada, si no recuerdo mal, seria asi:
Código:
|
select codF from ARTICULOS group by codF having count(*) >= ALL (select count(*) from ARTICULOS group by codf);
|
EDIT: Probado B-)
EDIT 2: No me avive de que Loonatic habia puesto lo mismo, disculpas
|
|
|
|
_________________ Foros-FIUBA o muerte
|
|
|
|
|
loonatic
Nivel 9
Edad: 32
Registrado: 16 May 2009
Mensajes: 1256
Carrera: Sistemas
|
|
SorLali escribió:
|
En el parcial, para un ejercicio parecido se me ocurrio lo siguiente:
Código:
|
select codF, count(*) from ARTICULOS group by codF order by count(*) desc limit 1;
|
Recuerdo que me levante a preguntar si limit esta permitido (no recuerdo si es estandar) aunque no recuerdo que me contestaron X-D
|
Estoy casi segura de que no está permitido.
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 33
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
Si si, definitivamente lo correcto es lo que puso loonatic.
El primero codigo que puso karajero no me muestra lo que queria y el 2do no esta permitido usar subconsultas dentro de un FROM (segun dijieron en clase)
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 33
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
PD (para SorLali): el limit no aparece en la hojita que da la catedra de "comandos permitidos" asi que no creo que pueda usarse
|
|
|
|
|
|
|
|
|
calet
Nivel 3
Edad: 23
Registrado: 21 Ago 2007
Mensajes: 57
Ubicación: Santos Lugares
Carrera: Informática
|
|
Buenas, tengo dudas sobre que se recomienda usar en las consultas de SQL, mas que nada para saber si prefieren mas simplicidad o performance.
Y tambien si hay cosas que esten prohibidas, como las sub queries en el from.
Por ejemplo, entre estas 2 consultas, cual seria preferible (suponiendo que no manquie y ambas hacen lo mismo)
Código:
|
select distinct A.ENombre
from Empleado A, Certificado B, Aeronave C
where A.EId = B.EId
and C.AId = B.AId
and C.Rango > 5000
and not exists (
select *
from Aeronave D
where D.AId = B.AId
and D.ANombre = "BOEING"));
select distinct A.ENombre
from Empleado
where exists (
select *
from Certificado B
where A.EId = B.EId
and exists (
select *
from Aeronave C
where C.AId = B.AId
and C.Rango > 5000)
and not exists (
select *
from Aeronave D
where D.AId = B.AId
and D.ANombre = "BOEING"));
|
|
|
|
|
|
|
|
|
|
|
|
Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro No podés responder a temas en este foro No podés editar tus mensajes en este foro No podés borrar tus mensajes en este foro No podés votar en encuestas en este foro No Podéspostear archivos en este foro No Podés bajar archivos de este foro
|
Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker365 Attacks blocked.
|