Obtener fila del almacen con precio más bajo para cada artículo.

17/05/2007 - 17:30 por Salvador Ramos | Informe spam
Hola a todos,

Tengo la siguiente tabla de artículos: almacen, articulo, descripcion,
precio, proveedor, ...
La PK es almacen+articulo
Hay una serie de almacenes, de los cuales sólo quiero la comparativa entre
el 1, 3, 5, 6 y 11.

Con la siguiente consulta obtengo las filas deseadas:
select articulo, min(precio) as PrMinimo
from avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo

Ahora el problema es que no quiero mostrar sólo el artículo y precio mínimo,
sino que quiero mostrar todas las columnas de la tabla articulos. Si no, no
puedo saber en qué almacen es más barato ni otros datos de esa fila.

Como puedo obtener, por cada artículo, la fila correspondiente al almacen
que tiene el precio más bajo entre los seleccionados ?

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm

Preguntas similare

Leer las respuestas

#1 Norman A. Armas
17/05/2007 - 18:25 | Informe spam
Hola Salvador, cuanto tiempo :-)
Te lo hace un poco dificil el que no tengas por ejemplo un identity en la
columna o un uniqueidentiquier pero mas o menos seria asi la idea

select distinct
a1.articulo,a1.descripcion,
(
select top 1
a2.precio
from
avlArtic as a2
where
a2.almacen in(1, 3, 5, 6, 11)
order by
a2.precio desc
) as myprecio,
(
select top 1
a3.precio
from
avlArtic as a3
where
a3.almacen in(1, 3, 5, 6, 11)
order by
a3precio desc
) as myproveedor,
from
avlArtic as a1
where
a1.almacen in(1, 3, 5, 6, 11)
order by
a1.articulo




"Salvador Ramos" wrote in message
news:
Hola a todos,

Tengo la siguiente tabla de artículos: almacen, articulo, descripcion,
precio, proveedor, ...
La PK es almacen+articulo
Hay una serie de almacenes, de los cuales sólo quiero la comparativa entre
el 1, 3, 5, 6 y 11.

Con la siguiente consulta obtengo las filas deseadas:
select articulo, min(precio) as PrMinimo
from avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo

Ahora el problema es que no quiero mostrar sólo el artículo y precio
mínimo, sino que quiero mostrar todas las columnas de la tabla articulos.
Si no, no puedo saber en qué almacen es más barato ni otros datos de esa
fila.

Como puedo obtener, por cada artículo, la fila correspondiente al almacen
que tiene el precio más bajo entre los seleccionados ?

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm



Respuesta Responder a este mensaje
#2 Norman A. Armas
17/05/2007 - 18:27 | Informe spam
Un errorsito :-)
en el segundo subquery sustituye precio por proveedor.

select distinct
a1.articulo,a1.descripcion,
(
select top 1
a2.precio
from
avlArtic as a2
where
a2.almacen in(1, 3, 5, 6, 11)
order by
a2.precio desc
) as myprecio,
(
select top 1
a3.proveerdor
from
avlArtic as a3
where
a3.almacen in(1, 3, 5, 6, 11)
order by
a3precio desc
) as myproveedor,
from
avlArtic as a1
where
a1.almacen in(1, 3, 5, 6, 11)
order by
a1.articulo


"Salvador Ramos" wrote in message
news:
Hola a todos,

Tengo la siguiente tabla de artículos: almacen, articulo, descripcion,
precio, proveedor, ...
La PK es almacen+articulo
Hay una serie de almacenes, de los cuales sólo quiero la comparativa entre
el 1, 3, 5, 6 y 11.

Con la siguiente consulta obtengo las filas deseadas:
select articulo, min(precio) as PrMinimo
from avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo

Ahora el problema es que no quiero mostrar sólo el artículo y precio
mínimo, sino que quiero mostrar todas las columnas de la tabla articulos.
Si no, no puedo saber en qué almacen es más barato ni otros datos de esa
fila.

Como puedo obtener, por cada artículo, la fila correspondiente al almacen
que tiene el precio más bajo entre los seleccionados ?

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm



Respuesta Responder a este mensaje
#3 Salvador Ramos
17/05/2007 - 18:59 | Informe spam
Hola Norman,

Es un placer leerte de nuevo por aquí, espero que todo vaya bien, y que nos
visites con mayor frecuencia :-)
Muchas gracias por tu respuesta

He estado revisando la idea que propones, y creo que va a penalizar mucho el
rendimiento si vamos por ahí, ya que tendría que poner una select por cada
columna que quiera añadir (y serán unas cuantas). He estado dandole vueltas
y probando con esta consulta, aun no he verificado si realmente hace lo que
necesito, pero creo que por aquí va la idea:
select A.cod_artic, A.EESS, A.precio_costo, A.cod_proveed
from avlArtic A inner join
(select cod_artic, min(precio_costo) PrMinimo
from avlArtic
where EESS in(1, 3, 5, 6, 11)
group by cod_artic
) PM on A.cod_artic = PM.cod_artic and A.precio_costo = PM.PrMinimo
order by A.cod_artic, A.EESS

Perdón por no haber puesto los nombres reales de las columnas de mi tabla,
ya que intenté simplificar el problema (EESS se refiere a almacenes).

La idea es hacer una join contra la select de los precios mínimos, aunque
obtendría algunos duplicados en caso de coincidir el precio mínimo en varios
almacenes no me importa.

Bueno, ya sigo investigando, y revisando vuestras propuestas.

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Norman A. Armas" <lllliiinnk hotmail com> escribió en el mensaje
news:OI4nI$
Un errorsito :-)
en el segundo subquery sustituye precio por proveedor.

select distinct
a1.articulo,a1.descripcion,
(
select top 1
a2.precio
from
avlArtic as a2
where
a2.almacen in(1, 3, 5, 6, 11)
order by
a2.precio desc
) as myprecio,
(
select top 1
a3.proveerdor
from
avlArtic as a3
where
a3.almacen in(1, 3, 5, 6, 11)
order by
a3precio desc
) as myproveedor,
from
avlArtic as a1
where
a1.almacen in(1, 3, 5, 6, 11)
order by
a1.articulo


"Salvador Ramos" wrote in message
news:
Hola a todos,

Tengo la siguiente tabla de artículos: almacen, articulo, descripcion,
precio, proveedor, ...
La PK es almacen+articulo
Hay una serie de almacenes, de los cuales sólo quiero la comparativa
entre el 1, 3, 5, 6 y 11.

Con la siguiente consulta obtengo las filas deseadas:
select articulo, min(precio) as PrMinimo
from avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo

Ahora el problema es que no quiero mostrar sólo el artículo y precio
mínimo, sino que quiero mostrar todas las columnas de la tabla articulos.
Si no, no puedo saber en qué almacen es más barato ni otros datos de esa
fila.

Como puedo obtener, por cada artículo, la fila correspondiente al almacen
que tiene el precio más bajo entre los seleccionados ?

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm







Respuesta Responder a este mensaje
#4 Alejandro Mesa
17/05/2007 - 19:31 | Informe spam
Salvador,

select
a.*
from
dbo.avlArtic as a
inner join
(
select articulo, min(precio) as PrMinimo
from dbo.avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo
) as b
on a.articulo = b.articulo
and a.precio = b.PrMinimo
where
a.almacen in(1, 3, 5, 6, 11)
order by
a.articulo,
a.almacen

select
a.*
from
dbo.avlArtic as a
where
a.precio = (
select
min(b.precio)
from
dbo.avlArtic as b
where
b.articulo = b.articulo
and b.almacen in(1, 3, 5, 6, 11)
) as b
where
a.almacen in(1, 3, 5, 6, 11)
order by
a.articulo,
a.almacen

;with cte
as
(
select
*,
rank() over(partition by articulo order by precio DESC) as rank
from
dbo.avlArtic
where
almacen in(1, 3, 5, 6, 11)
)
select
*
from
cte
where
rank = 1
order by
articulo,
almacen
go


AMB


"Salvador Ramos" wrote:

Hola a todos,

Tengo la siguiente tabla de artículos: almacen, articulo, descripcion,
precio, proveedor, ...
La PK es almacen+articulo
Hay una serie de almacenes, de los cuales sólo quiero la comparativa entre
el 1, 3, 5, 6 y 11.

Con la siguiente consulta obtengo las filas deseadas:
select articulo, min(precio) as PrMinimo
from avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo

Ahora el problema es que no quiero mostrar sólo el artículo y precio mínimo,
sino que quiero mostrar todas las columnas de la tabla articulos. Si no, no
puedo saber en qué almacen es más barato ni otros datos de esa fila.

Como puedo obtener, por cada artículo, la fila correspondiente al almacen
que tiene el precio más bajo entre los seleccionados ?

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm




Respuesta Responder a este mensaje
#5 Norman A. Armas
17/05/2007 - 20:41 | Informe spam
Tienes razon, por ahi la cosa es mas optima.

saludos.


"Salvador Ramos" wrote in message
news:%
Hola Norman,

Es un placer leerte de nuevo por aquí, espero que todo vaya bien, y que
nos visites con mayor frecuencia :-)
Muchas gracias por tu respuesta

He estado revisando la idea que propones, y creo que va a penalizar mucho
el rendimiento si vamos por ahí, ya que tendría que poner una select por
cada columna que quiera añadir (y serán unas cuantas). He estado dandole
vueltas y probando con esta consulta, aun no he verificado si realmente
hace lo que necesito, pero creo que por aquí va la idea:
select A.cod_artic, A.EESS, A.precio_costo, A.cod_proveed
from avlArtic A inner join
(select cod_artic, min(precio_costo) PrMinimo
from avlArtic
where EESS in(1, 3, 5, 6, 11)
group by cod_artic
) PM on A.cod_artic = PM.cod_artic and A.precio_costo = PM.PrMinimo
order by A.cod_artic, A.EESS

Perdón por no haber puesto los nombres reales de las columnas de mi tabla,
ya que intenté simplificar el problema (EESS se refiere a almacenes).

La idea es hacer una join contra la select de los precios mínimos, aunque
obtendría algunos duplicados en caso de coincidir el precio mínimo en
varios almacenes no me importa.

Bueno, ya sigo investigando, y revisando vuestras propuestas.

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Norman A. Armas" <lllliiinnk hotmail com> escribió en el mensaje
news:OI4nI$
Un errorsito :-)
en el segundo subquery sustituye precio por proveedor.

select distinct
a1.articulo,a1.descripcion,
(
select top 1
a2.precio
from
avlArtic as a2
where
a2.almacen in(1, 3, 5, 6, 11)
order by
a2.precio desc
) as myprecio,
(
select top 1
a3.proveerdor
from
avlArtic as a3
where
a3.almacen in(1, 3, 5, 6, 11)
order by
a3precio desc
) as myproveedor,
from
avlArtic as a1
where
a1.almacen in(1, 3, 5, 6, 11)
order by
a1.articulo


"Salvador Ramos" wrote in message
news:
Hola a todos,

Tengo la siguiente tabla de artículos: almacen, articulo, descripcion,
precio, proveedor, ...
La PK es almacen+articulo
Hay una serie de almacenes, de los cuales sólo quiero la comparativa
entre el 1, 3, 5, 6 y 11.

Con la siguiente consulta obtengo las filas deseadas:
select articulo, min(precio) as PrMinimo
from avlArtic
where almacen in(1, 3, 5, 6, 11)
group by articulo

Ahora el problema es que no quiero mostrar sólo el artículo y precio
mínimo, sino que quiero mostrar todas las columnas de la tabla
articulos. Si no, no puedo saber en qué almacen es más barato ni otros
datos de esa fila.

Como puedo obtener, por cada artículo, la fila correspondiente al
almacen que tiene el precio más bajo entre los seleccionados ?

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm











Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida