obtener ultimo precio

12/09/2008 - 15:55 por mp | Informe spam
Señores, necesito na sentencia sql que me devuelva el ultimo precio de venta
de un articulo,
(la ultima vez que se vendio).
Con la sentencia que expongo mas abajo obtengo linea repetidas de articulos
segun entiendo que es debido
al group by. El mismo articulo con precios y fechas distintas.
Necesito solo obtener la ultima vez que se vendio.
Que le falta a la consulta ????

Gracias por la ayuda

MP

select codiarti, max(fecdoc) as fecha,pventa1
from docventa
where td in('FC','BL')
group by codiarti,pventa1

Preguntas similare

Leer las respuestas

#6 mp
12/09/2008 - 18:21 | Informe spam
Alejandro, mejoro mucho respecto de la que yo tenia, pero aun asi, me
entrega lineas duplicadas, ejemplo:

Codigo fecha precio
ha0300350 09-09-2008 275.00
ha0300350 20-08-2008 275.00





"Alejandro Mesa" escribió en el
mensaje news:
Pudieras tratar usando:

SELECT
codiarti, fecdoc, pventa1
FROM
docventa AS dv
WHERE
td in('FC','BL')
AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM docventa AS d
WHERE d.codiarti = dv.codiarti AND d.td = dv.td
GROUP BY d.codiarti
)
GO

Si el articulo se vendio multiples veces en el mismo tiempo, entonces la
sentencia anterior puede retornar multiples filas para un mismo valor de
[codiarti], en cuyo caso tendremos que usar algun otro mecanismo para
romper
el empate. Pudieramos usar la columna [pventa1] para romper el empate, en
caso de haber, pero para hacerlo mas simple voy a usar una tabla temporal
con
una clave ? (surrogate).

create table #t(
sk int not null identity(1, 1) unique clustered,
codiarti varchar(15) not null,
fecdoc datetime not null,
pventa1 money
)

insert into #t(codiarti, fecdoc, pventa1)
SELECT
codiarti, fecdoc, pventa1
FROM
docventa AS dv
WHERE
td in('FC','BL')
AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM docventa AS d
WHERE d.codiarti = dv.codiarti AND d.td = dv.td
GROUP BY d.codiarti
)

select
*
from
(
select
codiarti, fecdoc, pventa1,
(
select count(*)
from #t as b
where b.codiarti = a.codiarti and b.sk <= a.sk
) as rnk
from #t as a
) as t
where
rnk = 1

drop table #t
GO


AMB


"mp" wrote:

Gracias señores por responder.
Estamos usando SQLServer 2000 SP4.
Efectivamente necesito el ultimo precio de venta de todos los articulos.
El campo fecha incluye tiempo y como ya dije, con la sentencia que les
mostre en post anterior en algunos casos me muestra varios ya que el
group
by muestra cuando un
articulo se vendio con distinto precio.(segun entiendo)

MP

"Alejandro Mesa" escribió en el
mensaje news:
>- Este campo fecha incluye timpo?
> - Puede haberse vendido el mismo producto multiples veces en el mismo
> tiempo?
> - Cual version de SQL Server usas?
>
> ; with r_set
> as
> (
> select
> codiarti, fecdoc, pventa1,
> row_number() over(partition by codiarti order by fecdoc DESC) as rn
> from docventa
> where td in('FC','BL')
> )
> select *
> from r_set
> where rn = 1;
> GO
>
>
> AMB
>
>
>
> "mp" wrote:
>
>> Señores, necesito na sentencia sql que me devuelva el ultimo precio de
>> venta
>> de un articulo,
>> (la ultima vez que se vendio).
>> Con la sentencia que expongo mas abajo obtengo linea repetidas de
>> articulos
>> segun entiendo que es debido
>> al group by. El mismo articulo con precios y fechas distintas.
>> Necesito solo obtener la ultima vez que se vendio.
>> Que le falta a la consulta ????
>>
>> Gracias por la ayuda
>>
>> MP
>>
>> select codiarti, max(fecdoc) as fecha,pventa1
>> from docventa
>> where td in('FC','BL')
>> group by codiarti,pventa1
>>
>>
>>



Respuesta Responder a este mensaje
#7 Alejandro Mesa
12/09/2008 - 18:31 | Informe spam
Carlos M. Calvelo,

Lo puedes hacer de ambas formas. Fijate en la primera expresion de ese
predicado, si filtramos [td] en [dv], enotnces d.[tv] = dv.[td] generara el
mismo resultado.

SELECT
codiarti, fecdoc, pventa1
FROM
docventa AS dv
WHERE

td in('FC','BL')

AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM docventa AS d
WHERE d.codiarti = dv.codiarti

AND d.td = dv.td

GROUP BY d.codiarti
)
GO


AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 12 sep, 17:43, Alejandro Mesa
wrote:
> Pudieras tratar usando:
>
> SELECT
> codiarti, fecdoc, pventa1
> FROM
> docventa AS dv
> WHERE
> td in('FC','BL')
> AND fecdoc = (
> SELECT MAX(d.fecdoc)
> FROM docventa AS d
> WHERE d.codiarti = dv.codiarti AND d.td = dv.td
> GROUP BY d.codiarti
> )

Cuidado con la subconsulta Alejandro!

SELECT
codiarti, fecdoc, pventa1
FROM
docventa AS dv
WHERE
td in ('FC','BL')
AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM docventa AS d
WHERE d.codiarti = dv.codiarti AND d.td in ('FC','BL')
)

Eso si he entendido bien, claro!

Saludos,
Carlos

Respuesta Responder a este mensaje
#8 Carlos M. Calvelo
12/09/2008 - 18:55 | Informe spam
Hola Alejandro,

On 12 sep, 18:31, Alejandro Mesa
wrote:
Carlos M. Calvelo,

Lo puedes hacer de ambas formas. Fijate en la primera expresion de ese
predicado, si filtramos [td] en [dv], enotnces d.[tv] = dv.[td] generara el
mismo resultado.




Piensalo mejor y mira de donde pueden venir las lineas duplicadas
que acaba de mencionar MP.

O prueba con, por ejemplo, estos datos:

insert into docventa (codiarti,fecdoc,pventa1,td)
select 1,'20080101',100.0,'FC'
union select 1,'20080102',200.0,'BL'
union select 2,'20060101',300.0,'FC'
union select 2,'20070101',400.0,'BX'

Saludos,
Carlos
Respuesta Responder a este mensaje
#9 Alejandro Mesa
12/09/2008 - 19:01 | Informe spam
Cual sentencia estas ejecutando?

Ejemplo:

CREATE TABLE t (
codiarti VARCHAR(15) NOT NULL,
fecdoc DATETIME NOT NULL,
precio NUMERIC(10, 4) NOT NULL,
td VARCHAR(15) NOT NULL
)
GO

INSERT INTO t VALUES('ha0300350', '20080909', 275.00, 'FC')
INSERT INTO t VALUES('ha0300350', '20080820', 275.00, 'FC')
GO

SELECT
codiarti, fecdoc, precio
FROM
t AS dv
WHERE
td in('FC','BL')
AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM t AS d
WHERE d.codiarti = dv.codiarti AND d.td = dv.td
GROUP BY d.codiarti
)
GO

DROP TABLE t
GO

Resultado:

ha0300350 2008-09-09 00:00:00.000 275.0000


AMB



"mp" wrote:

Alejandro, mejoro mucho respecto de la que yo tenia, pero aun asi, me
entrega lineas duplicadas, ejemplo:

Codigo fecha precio
ha0300350 09-09-2008 275.00
ha0300350 20-08-2008 275.00





"Alejandro Mesa" escribió en el
mensaje news:
> Pudieras tratar usando:
>
> SELECT
> codiarti, fecdoc, pventa1
> FROM
> docventa AS dv
> WHERE
> td in('FC','BL')
> AND fecdoc = (
> SELECT MAX(d.fecdoc)
> FROM docventa AS d
> WHERE d.codiarti = dv.codiarti AND d.td = dv.td
> GROUP BY d.codiarti
> )
> GO
>
> Si el articulo se vendio multiples veces en el mismo tiempo, entonces la
> sentencia anterior puede retornar multiples filas para un mismo valor de
> [codiarti], en cuyo caso tendremos que usar algun otro mecanismo para
> romper
> el empate. Pudieramos usar la columna [pventa1] para romper el empate, en
> caso de haber, pero para hacerlo mas simple voy a usar una tabla temporal
> con
> una clave ? (surrogate).
>
> create table #t(
> sk int not null identity(1, 1) unique clustered,
> codiarti varchar(15) not null,
> fecdoc datetime not null,
> pventa1 money
> )
>
> insert into #t(codiarti, fecdoc, pventa1)
> SELECT
> codiarti, fecdoc, pventa1
> FROM
> docventa AS dv
> WHERE
> td in('FC','BL')
> AND fecdoc = (
> SELECT MAX(d.fecdoc)
> FROM docventa AS d
> WHERE d.codiarti = dv.codiarti AND d.td = dv.td
> GROUP BY d.codiarti
> )
>
> select
> *
> from
> (
> select
> codiarti, fecdoc, pventa1,
> (
> select count(*)
> from #t as b
> where b.codiarti = a.codiarti and b.sk <= a.sk
> ) as rnk
> from #t as a
> ) as t
> where
> rnk = 1
>
> drop table #t
> GO
>
>
> AMB
>
>
> "mp" wrote:
>
>> Gracias señores por responder.
>> Estamos usando SQLServer 2000 SP4.
>> Efectivamente necesito el ultimo precio de venta de todos los articulos.
>> El campo fecha incluye tiempo y como ya dije, con la sentencia que les
>> mostre en post anterior en algunos casos me muestra varios ya que el
>> group
>> by muestra cuando un
>> articulo se vendio con distinto precio.(segun entiendo)
>>
>> MP
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> >- Este campo fecha incluye timpo?
>> > - Puede haberse vendido el mismo producto multiples veces en el mismo
>> > tiempo?
>> > - Cual version de SQL Server usas?
>> >
>> > ; with r_set
>> > as
>> > (
>> > select
>> > codiarti, fecdoc, pventa1,
>> > row_number() over(partition by codiarti order by fecdoc DESC) as rn
>> > from docventa
>> > where td in('FC','BL')
>> > )
>> > select *
>> > from r_set
>> > where rn = 1;
>> > GO
>> >
>> >
>> > AMB
>> >
>> >
>> >
>> > "mp" wrote:
>> >
>> >> Señores, necesito na sentencia sql que me devuelva el ultimo precio de
>> >> venta
>> >> de un articulo,
>> >> (la ultima vez que se vendio).
>> >> Con la sentencia que expongo mas abajo obtengo linea repetidas de
>> >> articulos
>> >> segun entiendo que es debido
>> >> al group by. El mismo articulo con precios y fechas distintas.
>> >> Necesito solo obtener la ultima vez que se vendio.
>> >> Que le falta a la consulta ????
>> >>
>> >> Gracias por la ayuda
>> >>
>> >> MP
>> >>
>> >> select codiarti, max(fecdoc) as fecha,pventa1
>> >> from docventa
>> >> where td in('FC','BL')
>> >> group by codiarti,pventa1
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#10 mp
12/09/2008 - 19:20 | Informe spam
OK, Gracias muchachos con vuestra valiosa ayuda lo he conseguido.
Gracias y feliz finde...

MP

Me resulto con esta:


SELECT
codiarti, fecdoc, pventa1
FROM
docventa AS dv
WHERE

td in('FC','BL')

AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM docventa AS d
WHERE d.codiarti = dv.codiarti

AND d.td = dv.td

GROUP BY d.codiarti
)
GO





"Alejandro Mesa" escribió en el
mensaje news:
Cual sentencia estas ejecutando?

Ejemplo:

CREATE TABLE t (
codiarti VARCHAR(15) NOT NULL,
fecdoc DATETIME NOT NULL,
precio NUMERIC(10, 4) NOT NULL,
td VARCHAR(15) NOT NULL
)
GO

INSERT INTO t VALUES('ha0300350', '20080909', 275.00, 'FC')
INSERT INTO t VALUES('ha0300350', '20080820', 275.00, 'FC')
GO

SELECT
codiarti, fecdoc, precio
FROM
t AS dv
WHERE
td in('FC','BL')
AND fecdoc = (
SELECT MAX(d.fecdoc)
FROM t AS d
WHERE d.codiarti = dv.codiarti AND d.td = dv.td
GROUP BY d.codiarti
)
GO

DROP TABLE t
GO

Resultado:

ha0300350 2008-09-09 00:00:00.000 275.0000


AMB



"mp" wrote:

Alejandro, mejoro mucho respecto de la que yo tenia, pero aun asi, me
entrega lineas duplicadas, ejemplo:

Codigo fecha precio
ha0300350 09-09-2008 275.00
ha0300350 20-08-2008 275.00





"Alejandro Mesa" escribió en el
mensaje news:
> Pudieras tratar usando:
>
> SELECT
> codiarti, fecdoc, pventa1
> FROM
> docventa AS dv
> WHERE
> td in('FC','BL')
> AND fecdoc = (
> SELECT MAX(d.fecdoc)
> FROM docventa AS d
> WHERE d.codiarti = dv.codiarti AND d.td = dv.td
> GROUP BY d.codiarti
> )
> GO
>
> Si el articulo se vendio multiples veces en el mismo tiempo, entonces
> la
> sentencia anterior puede retornar multiples filas para un mismo valor
> de
> [codiarti], en cuyo caso tendremos que usar algun otro mecanismo para
> romper
> el empate. Pudieramos usar la columna [pventa1] para romper el empate,
> en
> caso de haber, pero para hacerlo mas simple voy a usar una tabla
> temporal
> con
> una clave ? (surrogate).
>
> create table #t(
> sk int not null identity(1, 1) unique clustered,
> codiarti varchar(15) not null,
> fecdoc datetime not null,
> pventa1 money
> )
>
> insert into #t(codiarti, fecdoc, pventa1)
> SELECT
> codiarti, fecdoc, pventa1
> FROM
> docventa AS dv
> WHERE
> td in('FC','BL')
> AND fecdoc = (
> SELECT MAX(d.fecdoc)
> FROM docventa AS d
> WHERE d.codiarti = dv.codiarti AND d.td = dv.td
> GROUP BY d.codiarti
> )
>
> select
> *
> from
> (
> select
> codiarti, fecdoc, pventa1,
> (
> select count(*)
> from #t as b
> where b.codiarti = a.codiarti and b.sk <= a.sk
> ) as rnk
> from #t as a
> ) as t
> where
> rnk = 1
>
> drop table #t
> GO
>
>
> AMB
>
>
> "mp" wrote:
>
>> Gracias señores por responder.
>> Estamos usando SQLServer 2000 SP4.
>> Efectivamente necesito el ultimo precio de venta de todos los
>> articulos.
>> El campo fecha incluye tiempo y como ya dije, con la sentencia que les
>> mostre en post anterior en algunos casos me muestra varios ya que el
>> group
>> by muestra cuando un
>> articulo se vendio con distinto precio.(segun entiendo)
>>
>> MP
>>
>> "Alejandro Mesa" escribió en
>> el
>> mensaje news:
>> >- Este campo fecha incluye timpo?
>> > - Puede haberse vendido el mismo producto multiples veces en el
>> > mismo
>> > tiempo?
>> > - Cual version de SQL Server usas?
>> >
>> > ; with r_set
>> > as
>> > (
>> > select
>> > codiarti, fecdoc, pventa1,
>> > row_number() over(partition by codiarti order by fecdoc DESC) as
>> > rn
>> > from docventa
>> > where td in('FC','BL')
>> > )
>> > select *
>> > from r_set
>> > where rn = 1;
>> > GO
>> >
>> >
>> > AMB
>> >
>> >
>> >
>> > "mp" wrote:
>> >
>> >> Señores, necesito na sentencia sql que me devuelva el ultimo precio
>> >> de
>> >> venta
>> >> de un articulo,
>> >> (la ultima vez que se vendio).
>> >> Con la sentencia que expongo mas abajo obtengo linea repetidas de
>> >> articulos
>> >> segun entiendo que es debido
>> >> al group by. El mismo articulo con precios y fechas distintas.
>> >> Necesito solo obtener la ultima vez que se vendio.
>> >> Que le falta a la consulta ????
>> >>
>> >> Gracias por la ayuda
>> >>
>> >> MP
>> >>
>> >> select codiarti, max(fecdoc) as fecha,pventa1
>> >> from docventa
>> >> where td in('FC','BL')
>> >> group by codiarti,pventa1
>> >>
>> >>
>> >>
>>
>>
>>



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