SQL - SELECT CON GROUP BY

 
Vista:

SELECT CON GROUP BY

Publicado por Alejandro (3 intervenciones) el 29/11/2019 16:04:13
Hola Buenos días Foro:

Estoy haciendo mis primeros pasos en Sql Server y necesito una mano con esto que parece sencillo pero no puedo resolverlo.
Tengo una tabla de artículos, con precio y vigencia. Y necesito mostrar por artículo el último precio (vigente a hoy)

Ejemplo:
Vigencia Artículo Precio
2019-08-01 1 100
2019-08-23 1 110
2019-09-05 1 115
2019-09-05 2 50
2019-09-08 2 52
2019-07-31 3 200
2019-08-05 3 210

El resultado me debería mostrar
Vigencia Artículo Precio
2019-09-05 1 115
2019-09-08 2 52
2019-08-05 3 210

Desde ya muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

SELECT CON GROUP BY

Publicado por Conde (1 intervención) el 29/11/2019 16:20:10
Creo que deberias usar
Select * from tabla Order by vigencia DESC group by artículo

Dime si te funcionó.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECT CON GROUP BY

Publicado por Alejandro (3 intervenciones) el 29/11/2019 16:37:08
No, no funcionó.
Éste es el mensaje, después del Select * con order y group

Mens. 8120, Nivel 16, Estado 1, Línea 2
La columna 'DBO.PreciosArticulos.FecVigencia' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 1.878
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SELECT CON GROUP BY

Publicado por Isaias (1416 intervenciones) el 29/11/2019 17:14:19
Veamos
1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE @PRECIOS AS TABLE (Vigencia DATETIME, Articulo CHAR(1),  Precio MONEY)
INSERT INTO @PRECIOS VALUES
('2019-08-01','1', 100),
('2019-08-23','1',  110),
('2019-09-05','1',  115),
('2019-09-05','2',  50),
('2019-09-08','2',  52),
('2019-07-31','3',  200),
('2019-08-05','3',  210)
 
select MAX(Vigencia) AS Vigencia, Articulo, Max(Precio) as PrecioMaximo
from @PRECIOS
group by  Articulo

Vigencia Articulo PrecioMaximo
2019-09-05 00:00:00.000 1 115.00
2019-09-08 00:00:00.000 2 52.00
2019-08-05 00:00:00.000 3 210.00
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECT CON GROUP BY

Publicado por Alejandro (3 intervenciones) el 29/11/2019 22:41:49
Isaias: gracias por responder.

Pero te cuento cuando tú dices:

1
2
select MAX(Vigencia) AS Vigencia, Articulo, Max(Precio) as PrecioMaximo from @PRECIOS
group by  Articulo

Haces: Max(Precio) as PrecioMaximo

Esto supone que el último precio (o más nuevo vigente) es el precio mayor, pero en caso de no ser así no funciona.

Si al ejemplo que presentas le agregas esta línea en el insert:
('2019-10-01',1, 80)

El resultado del select va a ser:
1
2
Vigencia      Articulo        PrecioMaximo
2019-10-01       1                    115
cosa que no es real, la última vigencia es esa 2019-10-01 pero el precio a esa fecha era 80

NOTA: Acá encontré la respuesta y la pego para quienes la necesiten:

1
2
3
4
5
6
7
8
WITH T AS
(
	SELECT Vigencia, Articulo, Precio,
		ROW_NUMBER() OVER(PARTITION BY Articulo ORDER BY Vigencia DESC) AS XX
	FROM @PRECIOS
)
SELECTVigencia, Articulo, Precio FROM T WHERE XX = 1;
GO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 1.878
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SELECT CON GROUP BY

Publicado por Isaias (1416 intervenciones) el 30/11/2019 05:17:36
Gracias Alejandro, solo que yo hice la prueba con los datos que tu publicaste, tienes razon, con el WITH funciona bien, toma en cuanta la FECHA MAYOR y por ende, el precio no importa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar