Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Query para traer los productos mas caros

Estas en el tema de Query para traer los productos mas caros en el foro de SQL Server en Foros del Web. Hola! Tengo que realizar una query que permita traer de tres tablas, el producto más caro. La query que realicé yo es esta: Código: Select ...
  #1 (permalink)  
Antiguo 01/07/2013, 17:35
 
Fecha de Ingreso: noviembre-2010
Mensajes: 175
Antigüedad: 13 años, 5 meses
Puntos: 1
Query para traer los productos mas caros

Hola! Tengo que realizar una query que permita traer de tres tablas, el producto más caro.
La query que realicé yo es esta:

Código:
Select 
		C.Nombre, 
		A.Nombre, 
		Max(B.Precio) as PrecioMaximo
From 
		Proveedores A
inner join
		Suministra B
on	
		A.Id = B.IdProveedor 
inner join
		Piezas C
on 
		B.CodigoPieza = C.Codigo 
Group by 
		A.Nombre,C.Nombre

...pero el resultado final, me trae absolutamente todos los productos por más que defina el campo con la funcion max y los agrupe al final

Saludos!!!

Última edición por t0n1; 01/07/2013 a las 17:41
  #2 (permalink)  
Antiguo 02/07/2013, 05:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Query para traer los productos mas caros

Cita:
...pero el resultado final, me trae absolutamente todos los productos por más que defina el campo con la funcion max y los agrupe al final
Te trae todos, porque estás pidiendo precisamente eso al hacer un GROUP BY: El máximo de cada producto...
Si lo que quieres es el el precio del valor máximo de todos, no deberías agruparlo. Pero si lo que quieres es el nombre de proveedor y pieza, lo que corresponde es HAVING:
Código SQL:
Ver original
  1. SELECT
  2.         C.Nombre,
  3.         A.Nombre
  4. FROM
  5.         Proveedores A INNER JOIN Suministra B ON A.Id = B.IdProveedor
  6.                 INNER JOIN Piezas C ON  B.CodigoPieza = C.Codigo
  7. HAVING B.Precio = MAX(B.Precio)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/07/2013, 12:21
 
Fecha de Ingreso: noviembre-2010
Mensajes: 175
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Query para traer los productos mas caros

editado: borrar
  #4 (permalink)  
Antiguo 02/07/2013, 12:22
 
Fecha de Ingreso: noviembre-2010
Mensajes: 175
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Query para traer los productos mas caros

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Te trae todos, porque estás pidiendo precisamente eso al hacer un GROUP BY: El máximo de cada producto...
Si lo que quieres es el el precio del valor máximo de todos, no deberías agruparlo. Pero si lo que quieres es el nombre de proveedor y pieza, lo que corresponde es HAVING:
Código SQL:
Ver original
  1. SELECT
  2.         C.Nombre,
  3.         A.Nombre
  4. FROM
  5.         Proveedores A INNER JOIN Suministra B ON A.Id = B.IdProveedor
  6.                 INNER JOIN Piezas C ON  B.CodigoPieza = C.Codigo
  7. HAVING B.Precio = MAX(B.Precio)

Hola!

Lo que quiero hacer es mostrar los precios más caros de cada proveedor. Por eso los agrupé. Pero el problema es que por ej, el proveedor srl, tiene un producto que vale 50 y otro que vale 100 y me está mostrando los dos en vez de el de 100.

Usé la query que me sugeriste y me tira este error: La columna 'Suministra.Precio' de la cláusula HAVING no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.
  #5 (permalink)  
Antiguo 02/07/2013, 13:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Query para traer los productos mas caros

Cita:
Iniciado por t0n1 Ver Mensaje
Hola!

Lo que quiero hacer es mostrar los precios más caros de cada proveedor. Por eso los agrupé. Pero el problema es que por ej, el proveedor srl, tiene un producto que vale 50 y otro que vale 100 y me está mostrando los dos en vez de el de 100.

Usé la query que me sugeriste y me tira este error: La columna 'Suministra.Precio' de la cláusula HAVING no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.

Código SQL:
Ver original
  1. SELECT
  2.         C.Nombre,
  3.         A.Nombre
  4. FROM
  5.         Proveedores A INNER JOIN Suministra B ON A.Id = B.IdProveedor
  6.                 INNER JOIN Piezas C ON  B.CodigoPieza = C.Codigo
  7. HAVING B.Precio = MAX(B.Precio)
  8. GROUP BY b.precio

.......................
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 02/07/2013, 13:50
 
Fecha de Ingreso: noviembre-2010
Mensajes: 175
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Query para traer los productos mas caros

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. SELECT
  2.         C.Nombre,
  3.         A.Nombre
  4. FROM
  5.         Proveedores A INNER JOIN Suministra B ON A.Id = B.IdProveedor
  6.                 INNER JOIN Piezas C ON  B.CodigoPieza = C.Codigo
  7. HAVING B.Precio = MAX(B.Precio)
  8. GROUP BY b.precio

.......................


Poniéndolo como me dices, me salió: Mens. 156, Nivel 15, Estado 1, Línea 9
Sintaxis incorrecta cerca de la palabra clave 'GROUP'.



Anteriormente coloqué el group by arriba del having y ahí agrupé por los tres campos y me sigue trayendo todos los precios...
  #7 (permalink)  
Antiguo 02/07/2013, 13:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Query para traer los productos mas caros

my mistake
Código SQL:
Ver original
  1. SELECT
  2.         C.Nombre,
  3.         A.Nombre
  4. FROM
  5.         Proveedores A INNER JOIN Suministra B ON A.Id = B.IdProveedor
  6.                 INNER JOIN Piezas C ON  B.CodigoPieza = C.Codigo
  7. GROUP BY b.precio
  8. HAVING B.Precio = MAX(B.Precio)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por gnzsoloyo; 02/07/2013 a las 14:57
  #8 (permalink)  
Antiguo 02/07/2013, 15:33
 
Fecha de Ingreso: noviembre-2010
Mensajes: 175
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Query para traer los productos mas caros

Cita:
Iniciado por Libras Ver Mensaje
my mistake

SELECT
C.Nombre,
A.Nombre
FROM
Proveedores A INNER JOIN Suministra B ON A.Id = B.IdProveedor
INNER JOIN Piezas C ON B.CodigoPieza = C.Codigo
GROUP BY b.precio
HAVING B.Precio = Max(B.Precio)

Lo que pasa en primer lugar, es que tira error porque no está agrupado por los otros dos campos que acompañan a precio y segundo, agrupándolo por los tres campos, sigue trayendo absolutamente todas las piezas.


Voy a poner la situación más desarrollada porque capaz, el error es mío de comprensión y las querys estan bien:

Yo tengo tres tablas con esta informacion:

Piezas

Codigo: 1, 2, 3, 4
Nombre: tornillo, martillo, cinta, tuerca

Suministra

CodigoPieza: 1, 2, 3, 4
IdProveedor: 45 (1, 2, 3) 55 (4)
Precio: 50, 250, 100, 150

Proveedores:
Id: 45, 55
Nombre: Srl, hmb


Lo que tendría que mostrar es, del proveedor 45, sólo la pieza 2 (martillo) que cuestra 250 y la tuerca del proveedor 55.

Con las querys que armé yo y las que me pusieron ustedes me trae absolutamente todas las piezas...
  #9 (permalink)  
Antiguo 02/07/2013, 16:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Query para traer los productos mas caros

Código SQL:
Ver original
  1. CREATE TABLE #piezas
  2. (
  3. codigo INT,
  4. nombre VARCHAR(20)
  5. )
  6.  
  7. CREATE TABLE #suministra
  8. (
  9. codigopieza INT,
  10. idproveedor INT,
  11. precio INT
  12. )
  13.  
  14. CREATE TABLE #proveedores
  15. (
  16. id INT,
  17. nombre VARCHAR(20)
  18. )
  19.  
  20. INSERT INTO #piezas VALUES (1,'tornillo')
  21. INSERT INTO #piezas VALUES (2,'martillo')
  22. INSERT INTO #piezas VALUES (3,'cinta')
  23. INSERT INTO #piezas VALUES (4,'tuerca')
  24.  
  25. INSERT INTO #suministra VALUES (1,45,50)
  26. INSERT INTO #suministra VALUES (2,45,250)
  27. INSERT INTO #suministra VALUES (3,45,150)
  28. INSERT INTO #suministra VALUES (4,55,150)
  29.  
  30. INSERT INTO #proveedores VALUES (45,'srl')
  31. INSERT INTO #proveedores VALUES (55,'hmb')
  32.  
  33. SELECT tabla.* FROM(
  34. SELECT t1.codigo,t1.nombre,t2.codigopieza,t2.idproveedor,t2.precio,t3.id,t3.nombre AS proveedor FROM #piezas AS t1
  35. LEFT JOIN #suministra AS t2 ON (t1.codigo=t2.codigopieza)
  36. LEFT JOIN #proveedores AS t3 ON (t2.idproveedor=t3.id)
  37. ) AS tabla
  38.  
  39. LEFT JOIN (SELECT MAX(precio) AS precio,idproveedor FROM #suministra GROUP BY idproveedor) AS tabla2 ON (tabla.precio=tabla2.precio AND tabla.idproveedor=tabla2.idproveedor)
  40. WHERE tabla2.precio IS NOT NULL
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 02/07/2013, 17:40
 
Fecha de Ingreso: noviembre-2010
Mensajes: 175
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Query para traer los productos mas caros

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. CREATE TABLE #piezas
  2. (
  3. codigo INT,
  4. nombre VARCHAR(20)
  5. )
  6.  
  7. CREATE TABLE #suministra
  8. (
  9. codigopieza INT,
  10. idproveedor INT,
  11. precio INT
  12. )
  13.  
  14. CREATE TABLE #proveedores
  15. (
  16. id INT,
  17. nombre VARCHAR(20)
  18. )
  19.  
  20. INSERT INTO #piezas VALUES (1,'tornillo')
  21. INSERT INTO #piezas VALUES (2,'martillo')
  22. INSERT INTO #piezas VALUES (3,'cinta')
  23. INSERT INTO #piezas VALUES (4,'tuerca')
  24.  
  25. INSERT INTO #suministra VALUES (1,45,50)
  26. INSERT INTO #suministra VALUES (2,45,250)
  27. INSERT INTO #suministra VALUES (3,45,150)
  28. INSERT INTO #suministra VALUES (4,55,150)
  29.  
  30. INSERT INTO #proveedores VALUES (45,'srl')
  31. INSERT INTO #proveedores VALUES (55,'hmb')
  32.  
  33. SELECT tabla.* FROM(
  34. SELECT t1.codigo,t1.nombre,t2.codigopieza,t2.idproveedor,t2.precio,t3.id,t3.nombre AS proveedor FROM #piezas AS t1
  35. LEFT JOIN #suministra AS t2 ON (t1.codigo=t2.codigopieza)
  36. LEFT JOIN #proveedores AS t3 ON (t2.idproveedor=t3.id)
  37. ) AS tabla
  38.  
  39. LEFT JOIN (SELECT MAX(precio) AS precio,idproveedor FROM #suministra GROUP BY idproveedor) AS tabla2 ON (tabla.precio=tabla2.precio AND tabla.idproveedor=tabla2.idproveedor)
  40. WHERE tabla2.precio IS NOT NULL

Buenísimo, gracias!!!!


Lo que no entiendo es por que esta respuesta que es la que muestra el práctico que estoy realizando, me trae todas las piezas:

Código SQL:
Ver original
  1. SELECT p1.Nombre, pr1.Nombre, Precio
  2. FROM Piezas p1 INNER JOIN
  3. (Suministra s1 INNER JOIN Proveedores pr1
  4. ON s1.IdProveedor = pr1.Id)
  5. ON p1.Codigo = s1.CodigoPieza
  6. WHERE Precio IN
  7. (SELECT MAX(Precio) FROM Suministra s2
  8. GROUP BY s2.CodigoPieza
  9. HAVING s2.CodigoPieza = p1.Codigo)

Última edición por gnzsoloyo; 02/07/2013 a las 19:24 Razón: SQL mal etiquetado
  #11 (permalink)  
Antiguo 03/07/2013, 07:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Query para traer los productos mas caros

Cita:
Iniciado por t0n1 Ver Mensaje
Buenísimo, gracias!!!!


Lo que no entiendo es por que esta respuesta que es la que muestra el práctico que estoy realizando, me trae todas las piezas:

Código SQL:
Ver original
  1. SELECT p1.Nombre, pr1.Nombre, Precio
  2. FROM Piezas p1 INNER JOIN
  3. (Suministra s1 INNER JOIN Proveedores pr1
  4. ON s1.IdProveedor = pr1.Id)
  5. ON p1.Codigo = s1.CodigoPieza
  6. WHERE Precio IN
  7. (SELECT MAX(Precio) FROM Suministra s2
  8. GROUP BY s2.CodigoPieza
  9. HAVING s2.CodigoPieza = p1.Codigo)
sencillo porque al hacer el group by de tu query lo estas haciendo por codigo pieza en lugar de por codigo proveedor, ademas le faltaria que ademas del maximo del producto tambien regresara el id proveedor, porque si tienes 2 proveedores que su maximo es 250, como va a saber que proveedor es??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: campo, funcion, join, productos, query, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:11.