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

#11 Alejandro Mesa
12/09/2008 - 19:23 | Informe spam
Calos,

Antes de yo seguir adivinando, creo que el OP deberia decirnos el papel que
juega la columna [td] en este problema.

- Puede darse el caso de dos ventas para el mismo codigo de articulo, mismo
tiempo, pero diferentes valores de [td]?

En ese caso tenes razon, puesto que al usar "d.ts in ..." la sentencia
considerara todos los miembros de la lista como un grupo y por tanto el valor
de max([fecdoc) sera el maximo para el articulo y grupo, no asi con la
expresion "dv.td = d.td" donde el maximo es calculado por cada miembro de la
lista, en caso de existir.

Lo mismo pasaria si un articulo se puede vender multiples veces al mismo
tiempo y con diferente valor de precio. Ejemplo, agrega a tu script las sgtes
filas:

union select 2,'20070102',400.0,'FC'
union select 2,'20070102',500.0,'FC'

Ahora tenemos duplicados por la misma fecha y [td].

De todas maneras, me parece importante la sugerencia que has hecho. Deja ver
con que se aparece ahora el OP.


AMB


"Carlos M. Calvelo" wrote:

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
#12 Carlos M. Calvelo
12/09/2008 - 19:54 | Informe spam
Hola Alejandro,

On 12 sep, 19:23, Alejandro Mesa
wrote:
Calos,

Antes de yo seguir adivinando, creo que el OP deberia decirnos el papel que
juega la columna [td] en este problema.

- Puede darse el caso de dos ventas para el mismo codigo de articulo, mismo
tiempo, pero diferentes valores de [td]?

En ese caso tenes razon, puesto que al usar "d.ts in ..." la sentencia
considerara todos los miembros de la lista como un grupo y por tanto el valor
de max([fecdoc) sera el maximo para el articulo y grupo, no asi con la
expresion "dv.td = d.td" donde el maximo es calculado por cada miembro de la
lista, en caso de existir.

Lo mismo pasaria si un articulo se puede vender multiples veces al mismo
tiempo y con diferente valor de precio. Ejemplo, agrega a tu script las sgtes
filas:

union select 2,'20070102',400.0,'FC'
union select 2,'20070102',500.0,'FC'

Ahora tenemos duplicados por la misma fecha y [td].

De todas maneras, me parece importante la sugerencia que has hecho. Deja ver
con que se aparece ahora el OP.




No me estoy refiriendo a esos casos ŽespecialesŽ que describes.

Probemos con estos datos:

insert into docventa (codiarti,fecdoc,pventa1,td)
select 1,'20080101',100.0,'FC'
union select 1,'20080102',200.0,'BL'

Un caso 'normal' donde claramente queremos el segundo registro

Prueba tu consulta (devuelve los dos registos) y mi alternativa.
No son equivalentes.

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

insert into docventa (codiarti,fecdoc,pventa1,td)
select 1,'20080101',100.0,'FC'
union select 1,'20080102',200.0,'BL'



Con la sentencia que usa la correlacion por [td], calculamos la maxima fecha
por cada combinacion de [codiarti] - [td].

- 1 - FC - 20080101
- 1 - BL - 20080102

Sin correlacion por [td], lo que calculamos es la maxima fecha de cada
codigo de articulo en el grupo ('FC', 'BL'), o lo que es lo mismo, en este
caso, la maxima fecha para cada articulo.

- 1 - 'FC', 'BL', 20080102


El mismo articulo se vende con diferentes valores de [td], correcto?.


AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 12 sep, 19:23, Alejandro Mesa
wrote:
> Calos,
>
> Antes de yo seguir adivinando, creo que el OP deberia decirnos el papel que
> juega la columna [td] en este problema.
>
> - Puede darse el caso de dos ventas para el mismo codigo de articulo, mismo
> tiempo, pero diferentes valores de [td]?
>
> En ese caso tenes razon, puesto que al usar "d.ts in ..." la sentencia
> considerara todos los miembros de la lista como un grupo y por tanto el valor
> de max([fecdoc) sera el maximo para el articulo y grupo, no asi con la
> expresion "dv.td = d.td" donde el maximo es calculado por cada miembro de la
> lista, en caso de existir.
>
> Lo mismo pasaria si un articulo se puede vender multiples veces al mismo
> tiempo y con diferente valor de precio. Ejemplo, agrega a tu script las sgtes
> filas:
>
> union select 2,'20070102',400.0,'FC'
> union select 2,'20070102',500.0,'FC'
>
> Ahora tenemos duplicados por la misma fecha y [td].
>
> De todas maneras, me parece importante la sugerencia que has hecho. Deja ver
> con que se aparece ahora el OP.
>

No me estoy refiriendo a esos casos ´especiales´ que describes.

Probemos con estos datos:

insert into docventa (codiarti,fecdoc,pventa1,td)
select 1,'20080101',100.0,'FC'
union select 1,'20080102',200.0,'BL'

Un caso 'normal' donde claramente queremos el segundo registro

Prueba tu consulta (devuelve los dos registos) y mi alternativa.
No son equivalentes.

Saludos,
Carlos

Respuesta Responder a este mensaje
#14 Carlos M. Calvelo
12/09/2008 - 21:20 | Informe spam
Hola Alejandro,

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

> insert into docventa (codiarti,fecdoc,pventa1,td)
> select 1,'20080101',100.0,'FC'
> union select 1,'20080102',200.0,'BL'

Con la sentencia que usa la correlacion por [td], calculamos la maxima fecha
por cada combinacion de [codiarti] - [td].

- 1 - FC - 20080101
- 1 - BL - 20080102

Sin correlacion por [td], lo que calculamos es la maxima fecha de cada
codigo de articulo en el grupo ('FC', 'BL'), o lo que es lo mismo, en este
caso, la maxima fecha para cada articulo.

- 1 - 'FC', 'BL', 20080102

El mismo articulo se vende con diferentes valores de [td], correcto?.




Correcto. Y yo estoy todo el rato interpretando como lo explicas
en esta segunda opción.

Yo baso esa interpretación en que el OP insiste en adquirir el
último precio *de cada artículo* y en la primera consulta que nos
dejó ver el 'td in ('FC','BL')' aparece en el where pero la
columna td no forma parte del select (del resultado).

Viendo la consulta del OP me parece entonces lo más lógico que lo que
quiere es una lista de todos los artículos con 'FC' o 'BL' en campo
td y obtener la fecha y el precio de venta de la última venta en ese
grupo. Fíjate que la clausula select no menciona la columna td.

Aunque creo que mi interpretación es la correcta (su mención
de las lineas duplicadas parece confirmarlo), me disculpo por
no haberlo explicado. Pero es que estuve asumiendo todo el rato
que tu no podrías haber interpretado otra cosa.
Ahora nos hemos entendido! :)

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

Si, por eso dije que es valido tu comentario.

Por costumbre, suelo postear la solucion mas sencilla que pueda hayar,
porque muchas veces el OP no es claro en lo que tiene y en lo que quiere.
Luego vienen los "pero ...". Ya tu sabes.


AMB



"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 12 sep, 20:31, Alejandro Mesa
wrote:
> Carlos M. Calvelo,
>
> > insert into docventa (codiarti,fecdoc,pventa1,td)
> > select 1,'20080101',100.0,'FC'
> > union select 1,'20080102',200.0,'BL'
>
> Con la sentencia que usa la correlacion por [td], calculamos la maxima fecha
> por cada combinacion de [codiarti] - [td].
>
> - 1 - FC - 20080101
> - 1 - BL - 20080102
>
> Sin correlacion por [td], lo que calculamos es la maxima fecha de cada
> codigo de articulo en el grupo ('FC', 'BL'), o lo que es lo mismo, en este
> caso, la maxima fecha para cada articulo.
>
> - 1 - 'FC', 'BL', 20080102
>
> El mismo articulo se vende con diferentes valores de [td], correcto?.
>

Correcto. Y yo estoy todo el rato interpretando como lo explicas
en esta segunda opción.

Yo baso esa interpretación en que el OP insiste en adquirir el
último precio *de cada artículo* y en la primera consulta que nos
dejó ver el 'td in ('FC','BL')' aparece en el where pero la
columna td no forma parte del select (del resultado).

Viendo la consulta del OP me parece entonces lo más lógico que lo que
quiere es una lista de todos los artículos con 'FC' o 'BL' en campo
td y obtener la fecha y el precio de venta de la última venta en ese
grupo. Fíjate que la clausula select no menciona la columna td.

Aunque creo que mi interpretación es la correcta (su mención
de las lineas duplicadas parece confirmarlo), me disculpo por
no haberlo explicado. Pero es que estuve asumiendo todo el rato
que tu no podrías haber interpretado otra cosa.
Ahora nos hemos entendido! :)

Saludos,
Carlos


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