como optimizar esto???

15/11/2003 - 15:47 por Tolo | Informe spam
Hola

estoy haciendo una función qeu me devuelve el precio de un articulo a través
de la variable @pv, para ello necisto hacer el cálculo como:

if not exists (select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_venta from t_articles where id_article = @article

Pero no puedo en el mismo select q miro si existe asignar el valor a mi
variable, y tengo q hacer ...

if exists (select preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@terce
else
select @pv = preu_venta from t_articles where id_article = @article


hay forma de mejorar esto???

gracias de nuevo

Preguntas similare

Leer las respuestas

#6 Tolo
15/11/2003 - 20:00 | Informe spam
hola Javier,

jeje, verás, no he terminado de resolver esto, y esto ahora ya es mas un
problema de PS-SQL que otra cosa, pero a ver si alguien sabe resolverlo, yo
lo he probado y no :(

Yo lo q tengo es una tabla de preciosEspeciales, y si no hay precio
especial, cojo el descuentodel tercero y el precio del artículo, si hay
preico especial lo cojo todo de ahí. Así que el select sql queda como:

SELECT @pv = COALESCE(T_PreusEspecials.preu_especial,
T_Articles.preu_venta), @des= COALESCE(T_PreusEspecials.descompte,
T_tercers.descompte)
FROM T_PreusEspecials
full JOIN T_articles on
T_Articles.id_article=T_PreusEspecials.fk_article
full JOIN T_tercers on T_tercers.id_tercer=T_PreusEspecials.fk_tercer
where T_tercers.id_tercer=@tercer and t_articles.id_article =@article

Pero claro, como puede ser que el registro T_PreusEspecials no exista (en
T_articles i T_Tercers si hay un registro), bueno, eso que el select no me
devuelve ninguna fila, :(



"Javier Loria" escribió en el mensaje
news:#
Hola Tolo:
Con gusto y antes de continuar queria felicitarte por el diseno de las
Tablas, para ser un Foxero con pocos meses de haber empezado en SQL


agarras
rapido la cosa (lo digo porque revise tus posteos previos).
Si traduzco tu Pseudocodigo Procedimental de:
-
Si Existe Precio Cliente entonces
@Precio=Precio_Cliente sino @Precio=Precio_Artículo
Ha "Pseucodigo de Conjuntos"
Precio= Si existe PrecioCliente PrecioCliente SINO PrecioArticulo.
Tendras tu sentencia:
==> SELECT COALESCE(preu_especial, preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
==> El COALESCE es como un ISNULL, lo que hace es devolverte el primer valor


NO
Nulo, en tu caso si existe preu_especial te da este valor, sino te de
preu_venta. La ventaja de COALESCE es que es ANSI y que permite mas de un
valor.
El LEFT JOIN te permite unir todos los Articulos con los Articulos que
existan en PreusEspecials, si un articulo NO existe en PreusEspecials en
LEFT JOIN siempre lo desplegara, y las columnas de PreusEspecials tendran
valor Nulo.
Si le agregas algunas columnas de articulos (Codigo de Articulo, Nombre,
etc.) te puedes construir una funcion en Linea que te permita hacer:
-
SELECT *
FROM dbo.MisPrecios('MiCliente')
-
Los IF's no son malos en SQL, pero si tienes demasiados es normalmente mal
sintoma.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Tolo escribio:
> Hola Javier,
>
> Ante todo muchas Gracias
>
> A ver si me explico bién, intentaré contarte todo el problema. Tengo
> una tabla de Artículos con un precio de venta, y luego una tabla de
> preciosxCliente en la cual guardo el id_cliente, id_articulo y
> precio. Pues bién, quiero una función que me dé el precio de un
> artículo por cliente, q en pseudocódigo sería como:
>
> Si Existe Precio Cliente entonces @Precio=Precio_Cliente
> sino @Precio=Precio_Artículo
>
> entonces esto traducido queda como:
>
> if not exists (select @pv = precio_Cliente from
> t_PreciosEspeciales where fk_articulo=@articulo and
> fk_cliente=@cliente) select @pv = preu_articulo from
> t_articulos where id_articulo = @articulo
>
> el problema está en que no puedo asignar el valor Precio_Cliente a
> @pv pues me da error, y claro, entonces debo hacer esto:
>
> if exists (select precio_Cliente from t_PreciosEspeciales where
> fk_articulo=@articulo and fk_cliente=@cliente)
> select @pv = precio_Cliente from t_PreciosEspeciales where
> fk_articulo=@articulo and fk_cliente=@cliente
> else
> select @pv = preu_articulo from t_articulos where id_articulo > > @articulo
>
> Con lo cual hago dos veces el mismo select, lo cual no me termina de
> convencer... :(
>
> gracias
>
>
>
> "Javier Loria" escribió en el mensaje
> news:
>> Hola Tolo:
>> Sin el esquema de las tablas es mucho mas dificil.
>> Si pretendes crear una funcion escalar con esto, vas a matar el
>> desempeno de SQL.
>> Prueba con esto:
>> /* Codigo SIN PROBAR y SIN ESQUEMA :( */
>> SELECT COALESCE(preu_especial,preu_venta)
>> FROM T_Articles
>> LEFT JOIN T_PreusEspecials
>> ON T_Articles.id_article=T_PreusEspecials.fk_article
>> T_PreusEspecials.fk_tercer=@tercer
>> WHERE T_Articles.id_article=@article
>> /* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */
>>
>> Si creas una funcion en Linea (eliminando el filtro del Article)
>> y agregando algunas columnas podrias usarlo como una vista
>> parametrizada con buen desemepeno.
>> Saludos,
>>
>>
>> Javier Loria
>> Costa Rica
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>> Tolo escribio:
>>> Hola
>>>
>>> estoy haciendo una función qeu me devuelve el precio de un articulo
>>> a través de la variable @pv, para ello necisto hacer el cálculo
>>> como:
>>>
>>> if not exists (select @pv = preu_especial from t_PreusEspecials
>>> where fk_article=@article and fk_tercer=@tercer)
>>> select @pv = preu_venta from t_articles where id_article > >>> @article
>>>
>>> Pero no puedo en el mismo select q miro si existe asignar el valor a
>>> mi variable, y tengo q hacer ...
>>>
>>> if exists (select preu_especial from t_PreusEspecials where
>>> fk_article=@article and fk_tercer=@tercer)
>>> select @pv = preu_especial from t_PreusEspecials where
>>> fk_article=@article and fk_tercer=@terce
>>> else
>>> select @pv = preu_venta from t_articles where id_article > >>> @article
>>>
>>>
>>> hay forma de mejorar esto???
>>>
>>> gracias de nuevo


Respuesta Responder a este mensaje
#7 Javier Loria
15/11/2003 - 21:05 | Informe spam
Hola Tolo:
PS-SQL???, como en SYBASE???
Algunas notas, con produndo desconocimiento de SYBASE:
a) Porque un FULL JOIN y NO UN LEFT JOIN?/ En tu caso un RIGTH porque
diste vuelta a la tabla de Articulos y de T_PreusEspecials
b) En la condicion del JOIN entre Articulos y PreusEspecials no solo
debe existir la igualdad sino tambien la condicion del proveedor, algo como:

ON
T_Articles.id_article=T_PreusEspecials.fk_article
AND T_PreusEspecials.fk_tercer=@tercer

Esta es una de las raras ocasiones donde no puedes hacer con el WHERE lo
mismo que con el JOIN. Esta condicion se plantea al momento de hacer el LEFT
JOIN si no hay ninguna fila que cumpla la condicion se crea una fila NULA.
Mientras que si filtras en el WHERE mas bien se elimina la fila existente.


Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Tolo escribio:
hola Javier,

jeje, verás, no he terminado de resolver esto, y esto ahora ya es mas
un problema de PS-SQL que otra cosa, pero a ver si alguien sabe
resolverlo, yo lo he probado y no :(

Yo lo q tengo es una tabla de preciosEspeciales, y si no hay precio
especial, cojo el descuentodel tercero y el precio del artículo, si
hay preico especial lo cojo todo de ahí. Así que el select sql queda
como:

SELECT @pv = COALESCE(T_PreusEspecials.preu_especial,
T_Articles.preu_venta), @des= COALESCE(T_PreusEspecials.descompte,
T_tercers.descompte)
FROM T_PreusEspecials
full JOIN T_articles on
T_Articles.id_article=T_PreusEspecials.fk_article
full JOIN T_tercers on
T_tercers.id_tercer=T_PreusEspecials.fk_tercer where
T_tercers.id_tercer=@tercer and t_articles.id_article =@article

Pero claro, como puede ser que el registro T_PreusEspecials no exista
(en T_articles i T_Tercers si hay un registro), bueno, eso que el
select no me devuelve ninguna fila, :(



"Javier Loria" escribió en el mensaje
news:#
Hola Tolo:
Con gusto y antes de continuar queria felicitarte por el diseno
de las Tablas, para ser un Foxero con pocos meses de haber empezado
en SQL agarras rapido la cosa (lo digo porque revise tus posteos
previos).
Si traduzco tu Pseudocodigo Procedimental de:
-
Si Existe Precio Cliente entonces
@Precio=Precio_Cliente sino @Precio=Precio_Artículo
Ha "Pseucodigo de Conjuntos"
Precio= Si existe PrecioCliente PrecioCliente SINO
PrecioArticulo. --
Tendras tu sentencia:
==>> SELECT COALESCE(preu_especial, preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
==>> El COALESCE es como un ISNULL, lo que hace es devolverte el primer
valor NO Nulo, en tu caso si existe preu_especial te da este valor,
sino te de preu_venta. La ventaja de COALESCE es que es ANSI y que
permite mas de un valor.
El LEFT JOIN te permite unir todos los Articulos con los Articulos
que existan en PreusEspecials, si un articulo NO existe en
PreusEspecials en LEFT JOIN siempre lo desplegara, y las columnas de
PreusEspecials tendran valor Nulo.
Si le agregas algunas columnas de articulos (Codigo de Articulo,
Nombre, etc.) te puedes construir una funcion en Linea que te
permita hacer: -
SELECT *
FROM dbo.MisPrecios('MiCliente')
-
Los IF's no son malos en SQL, pero si tienes demasiados es
normalmente mal sintoma.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Tolo escribio:
Hola Javier,

Ante todo muchas Gracias

A ver si me explico bién, intentaré contarte todo el problema. Tengo
una tabla de Artículos con un precio de venta, y luego una tabla de
preciosxCliente en la cual guardo el id_cliente, id_articulo y
precio. Pues bién, quiero una función que me dé el precio de un
artículo por cliente, q en pseudocódigo sería como:

Si Existe Precio Cliente entonces @Precio=Precio_Cliente
sino @Precio=Precio_Artículo

entonces esto traducido queda como:

if not exists (select @pv = precio_Cliente from
t_PreciosEspeciales where fk_articulo=@articulo and
fk_cliente=@cliente) select @pv = preu_articulo from
t_articulos where id_articulo = @articulo

el problema está en que no puedo asignar el valor Precio_Cliente a
@pv pues me da error, y claro, entonces debo hacer esto:

if exists (select precio_Cliente from t_PreciosEspeciales where
fk_articulo=@articulo and fk_cliente=@cliente)
select @pv = precio_Cliente from t_PreciosEspeciales where
fk_articulo=@articulo and fk_cliente=@cliente
else
select @pv = preu_articulo from t_articulos where id_articulo
= @articulo

Con lo cual hago dos veces el mismo select, lo cual no me termina de
convencer... :(

gracias



"Javier Loria" escribió en el mensaje
news:
Hola Tolo:
Sin el esquema de las tablas es mucho mas dificil.
Si pretendes crear una funcion escalar con esto, vas a matar el
desempeno de SQL.
Prueba con esto:
/* Codigo SIN PROBAR y SIN ESQUEMA :( */
SELECT COALESCE(preu_especial,preu_venta)
FROM T_Articles
LEFT JOIN T_PreusEspecials
ON T_Articles.id_article=T_PreusEspecials.fk_article
T_PreusEspecials.fk_tercer=@tercer
WHERE T_Articles.id_article=@article
/* Fin de Codigo SIN PROBAR Y SIN ESQUEMA */

Si creas una funcion en Linea (eliminando el filtro del
Article)
y agregando algunas columnas podrias usarlo como una vista
parametrizada con buen desemepeno.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Tolo escribio:
Hola

estoy haciendo una función qeu me devuelve el precio de un
articulo
a través de la variable @pv, para ello necisto hacer el cálculo
como:

if not exists (select @pv = preu_especial from t_PreusEspecials
where fk_article=@article and fk_tercer=@tercer)
select @pv = preu_venta from t_articles where id_article >>>>> @article

Pero no puedo en el mismo select q miro si existe asignar el
valor a mi variable, y tengo q hacer ...

if exists (select preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@tercer)
select @pv = preu_especial from t_PreusEspecials where
fk_article=@article and fk_tercer=@terce
else
select @pv = preu_venta from t_articles where id_article >>>>> @article


hay forma de mejorar esto???

gracias de nuevo
Respuesta Responder a este mensaje
#8 dbuendiab
16/11/2003 - 13:34 | Informe spam
Yo lo q tengo es una tabla de preciosEspeciales, y si no hay precio
especial, cojo el descuentodel tercero y el precio del artículo, si hay
preico especial lo cojo todo de ahí. Así que el select sql queda como:

SELECT @pv = COALESCE(T_PreusEspecials.preu_especial,
T_Articles.preu_venta), @des= COALESCE(T_PreusEspecials.descompte,
T_tercers.descompte)
FROM T_PreusEspecials
full JOIN T_articles on
T_Articles.id_article=T_PreusEspecials.fk_article
full JOIN T_tercers on T_tercers.id_tercer=T_PreusEspecials.fk_tercer
where T_tercers.id_tercer=@tercer and t_articles.id_article =@article

Pero claro, como puede ser que el registro T_PreusEspecials no exista (en
T_articles i T_Tercers si hay un registro), bueno, eso que el select no me
devuelve ninguna fila, :(



Yo empezaría a desarrollar la consulta a partir de la tabla T_Articles
que me parece que es la más completa. Este select es el más general,
para cada artículo te presenta su precio de venta, y en caso de que
haya relación, los precios especiales y descuentos. Lo único que no me
cuadra mucho es que la tabla T_Tercers no esté relacionada con
T_Articles en lugar de T_PreusEspecials, no teniendo más información
he dejado que T_Tercers esté en relación con T_PreusEspecials.

SELECT
a.id_article, a.preu_venta,
b.preu_especial, b.descompte,
c.descomte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = b.fk_article
LEFT JOIN T_Tercers c ON a.id_tercer = b.fk_tercer
WHERE a.id_article = @article

Saludos,
Diego Buendia
Barcelona, Spain
Respuesta Responder a este mensaje
#9 Tolo
16/11/2003 - 17:25 | Informe spam
Hola,

siento contradecirte, pero la tabla articulos no esta relacionada con la
tabla de terceros, el unico punto de relacion sería la tabla
t_precios_especiales, pero en muchos casos ese registro no existiría :(
"Diego Buendia" escribió en el mensaje
news:
> Yo lo q tengo es una tabla de preciosEspeciales, y si no hay precio
> especial, cojo el descuentodel tercero y el precio del artículo, si hay
> preico especial lo cojo todo de ahí. Así que el select sql queda como:
>
> SELECT @pv = COALESCE(T_PreusEspecials.preu_especial,
> T_Articles.preu_venta), @des= COALESCE(T_PreusEspecials.descompte,
> T_tercers.descompte)
> FROM T_PreusEspecials
> full JOIN T_articles on
> T_Articles.id_article=T_PreusEspecials.fk_article
> full JOIN T_tercers on


T_tercers.id_tercer=T_PreusEspecials.fk_tercer
> where T_tercers.id_tercer=@tercer and t_articles.id_article


=@article
>
> Pero claro, como puede ser que el registro T_PreusEspecials no exista


(en
> T_articles i T_Tercers si hay un registro), bueno, eso que el select no


me
> devuelve ninguna fila, :(

Yo empezaría a desarrollar la consulta a partir de la tabla T_Articles
que me parece que es la más completa. Este select es el más general,
para cada artículo te presenta su precio de venta, y en caso de que
haya relación, los precios especiales y descuentos. Lo único que no me
cuadra mucho es que la tabla T_Tercers no esté relacionada con
T_Articles en lugar de T_PreusEspecials, no teniendo más información
he dejado que T_Tercers esté en relación con T_PreusEspecials.

SELECT
a.id_article, a.preu_venta,
b.preu_especial, b.descompte,
c.descomte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = b.fk_article
LEFT JOIN T_Tercers c ON a.id_tercer = b.fk_tercer
WHERE a.id_article = @article

Saludos,
Diego Buendia
Barcelona, Spain
Respuesta Responder a este mensaje
#10 dbuendiab
17/11/2003 - 00:28 | Informe spam
Qué sentido tiene la tabla Terceros, conceptualmente hablando?
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida