Ayuda con MySql y una consulta a la BD

Os explico.

Tengo una tabla de articulos. En dicha tabla hay un campo porcentaje, y un campo subfamilia a la cual pertenece el articulo. Entonces quiero consultar que articulo tiene el porcentaje mas alto en cada subfamilia, y pillar todos los datos de ese articulo. La consulta que hago es la siguiente:

SELECT * , max( porcentaje ) 'porcentaje'
FROM articulos
GROUP BY subfamilia

Bien, ahora viene el problema. Resulta que me pilla el porcentaje mas alto para cada subfamilia, pero el articulo en cuestión no coincide con este porcentaje. De hecho, tengo dos columnas porcentaje en la consulta (una por el *, y la otra por el max (porcentaje)) y el valor de estas dos columnas es distinto en todos los resultados.

Sabeis que tengo mal? Tiene que ser una tonteria pero no caigo.

Saludos
No se exactamente lo que pides, pero creo que deberia ser la consulta:

select *, max(porcentaje) as 'MaximoPorcenaje' from articulos group by subfamilia

por lo menos ponle un nombre diferente al del campo que ya tienes en la base de datos y asi vas descartando errores.

salu2 [oki]
monoculero escribió:No se exactamente lo que pides, pero creo que deberia ser la consulta:

select *, max(porcentaje) as 'MaximoPorcenaje' from articulos group by subfamilia

por lo menos ponle un nombre diferente al del campo que ya tienes en la base de datos y asi vas descarando errores.

salu2 [oki]

eso ya esta probado y nada...
Es que como trae todos los campos no está bien filtrado... esa consulta en otras bases de datos la verdad es que no funcionaria.

Te está trayendo el primer artículo de la subfamilia que encuentra, y al final el máximo porcentaje de la subfamilia.

Tendrias que casar por porcentajes para ver cual es el artículo que buscas.

select a.*
from (select subfamilia, max(porcentaje) as 'MaximoPorcenaje' from articulos group by subfamilia) as t, articulos as a
where a.subfamilia = t.subfamilia and a.porcentaje = t.MaximoPorcenaje

Si lo haces así y hay dos artículos con el mismo porcentaje (que a su vez es el máximo) te saldrá dos veces, si sólo quieres uno:

select a.*
from (select subfamilia, max(porcentaje) as 'MaximoPorcenaje' from articulos group by subfamilia) as t, articulos as a
where a.subfamilia = t.subfamilia and a.porcentaje = t.MaximoPorcenaje
group by a.subfamilia

saludos
podfrias poner las tablas que tienes?

por ejemplo:

CREATE TABLE DEPARTAMENTS
         (   NUM_DPT INTEGER,
   NOM_DPT CHAR(20),
   PLANTA INTEGER,
   EDIFICI CHAR(30),
   CIUTAT_DPT CHAR(20),
   PRIMARY KEY (NUM_DPT));

CREATE TABLE PROJECTES
         (   NUM_PROJ INTEGER,
   NOM_PROJ CHAR(10),
   PRODUCTE CHAR(20),
   PRESSUPOST INTEGER,
   PRIMARY KEY (NUM_PROJ));

CREATE TABLE EMPLEATS
         (   NUM_EMPL INTEGER,
   NOM_EMPL CHAR(30),
   SOU INTEGER,
   CIUTAT_EMPL CHAR(20),
   NUM_DPT INTEGER,
   NUM_PROJ INTEGER,
   PRIMARY KEY (NUM_EMPL),
   FOREIGN KEY (NUM_DPT) REFERENCES DEPARTAMENTS (NUM_DPT),
   FOREIGN KEY (NUM_PROJ) REFERENCES PROJECTES (NUM_PROJ));
la tabla no la puedo poner x que es de una BD de datos de una empresa y no creo que les haga gracia que la ponga aqui aunque solo sea la estructura.
Namco69 escribió:la tabla no la puedo poner x que es de una BD de datos de una empresa y no creo que les haga gracia que la ponga aqui aunque solo sea la estructura.

Pues que paguen a un consultor para que les haga el trabajo XD

PD: Primero debes agrupar por codigo de subfamilia y máximo, con esta tabla debes vincularla a la tabla de articulos donde estos 2 campos coincidan, con un inner join no se si podrias llegar a hacerlo, pero con un stored procedure fijo que sí.
deathline escribió:
Namco69 escribió:la tabla no la puedo poner x que es de una BD de datos de una empresa y no creo que les haga gracia que la ponga aqui aunque solo sea la estructura.

Pues que paguen a un consultor para que les haga el trabajo XD

PD: Primero debes agrupar por codigo de subfamilia y máximo, con esta tabla debes vincularla a la tabla de articulos donde estos 2 campos coincidan, con un inner join no se si podrias llegar a hacerlo, pero con un stored procedure fijo que sí.

Entendido.
7 respuestas