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

#11 Tolo
17/11/2003 - 21:47 | Informe spam
tabla de clientes/proveedores

"Diego Buendia" escribió en el mensaje
news:
Qué sentido tiene la tabla Terceros, conceptualmente hablando?
Respuesta Responder a este mensaje
#12 dbuendiab
18/11/2003 - 16:29 | 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




/*
(Copia y pega esto en el QA y ves ejecutando a trozos)

Vamos, como lo veo yo, que es un problema interesante:
*/

CREATE TABLE T_Tercers (
id_tercer int,
descompte real
)

CREATE TABLE T_Articles (
id_article int,
fk_tercer int, -- ¿no falta este campo? -
preu_venta real
)

CREATE TABLE T_PreusEspecials (
fk_article int,
fk_tercer int,
descompte real,
preu_especial real
)

INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 1, 10.0 )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 2, NULL )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 3, 25.0 )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 4, NULL )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 5, 20.0 )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 6, NULL )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 1, 1,
110.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 2, 1,
300.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 3, 2,
900.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 4, 2,
60.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 5, 2,
150.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 6, 3,
340.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 7, 4,
260.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 8, 4,
750.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 9, 5,
160.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 10,
5, 155.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 11,
5, 165.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 12,
5, 250.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 13,
6, 850.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 14,
6, 1250.0 )

INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( 3, NULL, NULL, 850.0 )
INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( 4, NULL, 50.0, NULL )
INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( NULL, 3, 50.0, NULL )
INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( NULL, 6, NULL, 1000.0 )

/*
Para un determinado artículo:
T_Articles
para aplicarle o no el descuento
T_PreusEspecials
(pero tengo que saber para cada artículo cuál es su id_tercer ¿no?
y no
me vale la relación en T_PreusEspecials porque pueden no estar
todos...

En mi opinión, falta el campo fk_tercer en T_Articles, para determinar
el
proveedor. Si tal campo existe, como asumo, esta es una posible
solución
razonada...

*/


descuentos especiales
SELECT a.id_article, a.preu_venta, b.preu_especial, b.descompte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = fk_article

SELECT a.id_article, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer

SELECT c.id_tercer, d.descompte As descompte_proveedor,
d.preu_especial as preu_especial_proveedor
FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer

SELECT
aa.id_article,
aa.fk_tercer,
aa.preu_venta,
aa.descompte As descompte_normal_proveedor,
bb.descompte As descompte_especial_proveedor,
bb.preu_especial As preu_especial_proveedor

FROM (
SELECT a.id_article, a.fk_tercer, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer
) aa
LEFT JOIN (
SELECT
c.id_tercer,
d.descompte,
d.preu_especial

FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer
) bb
ON aa.fk_tercer = bb.id_tercer

primera que
artículos
descuento especial

SELECT
aaa.id_article As Id,
aaa.preu_venta As PN, -- precio normal
aaa.preu_especial As PEA, -- preu_especial por articulo
aaa.descompte As DEA, -- descuento especial por artículo

bbb.descompte_especial_proveedor As DEP, --
descompte_especial_proveedor
bbb.preu_especial_proveedor As PEP, -- preu_especial_proveedor

bbb.descompte_normal_proveedor As DNP, -- descompte_normal_proveedor

CASE
WHEN NOT PEA IS NULL THEN PEA
WHEN NOT DEA IS NULL THEN PN * DEA / 100.0
WHEN NOT PEP IS NULL THEN PEP
WHEN NOT DEP IS NULL THEN PN * DEP / 100.0
WHEN NOT DNP IS NULL THEN PN * DNP / 100.0
ELSE PN
END As PrecioFinal

FROM
(
SELECT a.id_article, a.preu_venta, b.preu_especial, b.descompte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = fk_article
) aaa
INNER JOIN
(
SELECT
aa.id_article,
aa.fk_tercer,
aa.preu_venta,
aa.descompte As descompte_normal_proveedor,
bb.descompte As descompte_especial_proveedor,
bb.preu_especial As preu_especial_proveedor

FROM (
SELECT a.id_article, a.fk_tercer, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer
) aa
LEFT JOIN (
SELECT
c.id_tercer,
d.descompte,
d.preu_especial

FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer
) bb
ON aa.fk_tercer = bb.id_tercer
) bbb
ON aaa.id_article = bbb.id_article

precio final

SELECT
Id, PEA, DEA, PEP, DEP, DNP, PN,
CASE
WHEN NOT PEA IS NULL THEN PEA
WHEN NOT DEA IS NULL THEN PN * ( 100.0 - DEA ) / 100.0
WHEN NOT PEP IS NULL THEN PEP
WHEN NOT DEP IS NULL THEN PN * ( 100.0 - DEP ) / 100.0
WHEN NOT DNP IS NULL THEN PN * ( 100.0 - DNP ) / 100.0
ELSE PN
END As PrecioFinal
FROM (
SELECT
aaa.id_article As Id,
aaa.preu_venta As PN, -- precio normal
aaa.preu_especial As PEA, -- preu_especial por articulo
aaa.descompte As DEA, -- descuento especial por artículo

bbb.descompte_especial_proveedor As DEP, --
descompte_especial_proveedor
bbb.preu_especial_proveedor As PEP, -- preu_especial_proveedor

bbb.descompte_normal_proveedor As DNP -- descompte_normal_proveedor


FROM
(
SELECT a.id_article, a.preu_venta, b.preu_especial, b.descompte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = fk_article
) aaa
INNER JOIN
(
SELECT
aa.id_article,
aa.fk_tercer,
aa.preu_venta,
aa.descompte As descompte_normal_proveedor,
bb.descompte As descompte_especial_proveedor,
bb.preu_especial As preu_especial_proveedor

FROM (
SELECT a.id_article, a.fk_tercer, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer
) aa
LEFT JOIN (
SELECT
c.id_tercer,
d.descompte,
d.preu_especial

FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer
) bb
ON aa.fk_tercer = bb.id_tercer
) bbb
ON aaa.id_article = bbb.id_article
) aaaa

/*
No se si el case es correcto, pero si no al menos tienes todos los
posibles valores de precio/descuento para cada artículo así que te
lo podrás combinar

Saludos y suerte,

Diego Buendia
Barcelona Spain
*/
Respuesta Responder a este mensaje
#13 dbuendiab
18/11/2003 - 16:31 | Informe spam
EN EL OTRO POST HAY UN ERROR EN LA PENULTIMA CONSULTA,
ESTA ES LA SOLUCION CORRECTA (SALVO ERROR U OMISION). SALUDOS,

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




/*
(Copia y pega esto en el QA y ves ejecutando a trozos)

Vamos, como lo veo yo, que es un problema interesante:
*/

CREATE TABLE T_Tercers (
id_tercer int,
descompte real
)

CREATE TABLE T_Articles (
id_article int,
fk_tercer int, -- ¿no falta este campo? -
preu_venta real
)

CREATE TABLE T_PreusEspecials (
fk_article int,
fk_tercer int,
descompte real,
preu_especial real
)

INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 1, 10.0 )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 2, NULL )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 3, 25.0 )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 4, NULL )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 5, 20.0 )
INSERT T_Tercers ( id_tercer, descompte ) VALUES ( 6, NULL )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 1, 1,
110.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 2, 1,
300.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 3, 2,
900.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 4, 2,
60.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 5, 2,
150.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 6, 3,
340.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 7, 4,
260.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 8, 4,
750.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 9, 5,
160.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 10,
5, 155.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 11,
5, 165.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 12,
5, 250.0 )

INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 13,
6, 850.0 )
INSERT T_Articles ( id_article, fk_tercer, preu_venta ) VALUES ( 14,
6, 1250.0 )

INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( 3, NULL, NULL, 850.0 )
INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( 4, NULL, 50.0, NULL )
INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( NULL, 3, 50.0, NULL )
INSERT T_PreusEspecials ( fk_article, fk_tercer, descompte,
preu_especial )
VALUES ( NULL, 6, NULL, 1000.0 )

/*
Para un determinado artículo:
T_Articles
para aplicarle o no el descuento
T_PreusEspecials
(pero tengo que saber para cada artículo cuál es su id_tercer ¿no?
y no
me vale la relación en T_PreusEspecials porque pueden no estar
todos...

En mi opinión, falta el campo fk_tercer en T_Articles, para determinar
el
proveedor. Si tal campo existe, como asumo, esta es una posible
solución
razonada...

*/


descuentos especiales
SELECT a.id_article, a.preu_venta, b.preu_especial, b.descompte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = fk_article

SELECT a.id_article, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer

SELECT c.id_tercer, d.descompte As descompte_proveedor,
d.preu_especial as preu_especial_proveedor
FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer

SELECT
aa.id_article,
aa.fk_tercer,
aa.preu_venta,
aa.descompte As descompte_normal_proveedor,
bb.descompte As descompte_especial_proveedor,
bb.preu_especial As preu_especial_proveedor

FROM (
SELECT a.id_article, a.fk_tercer, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer
) aa
LEFT JOIN (
SELECT
c.id_tercer,
d.descompte,
d.preu_especial

FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer
) bb
ON aa.fk_tercer = bb.id_tercer

primera que
artículos
descuento especial

SELECT
aaa.id_article As Id,
aaa.preu_venta As PN, -- precio normal
aaa.preu_especial As PEA, -- preu_especial por articulo
aaa.descompte As DEA, -- descuento especial por artículo

bbb.descompte_especial_proveedor As DEP, --
descompte_especial_proveedor
bbb.preu_especial_proveedor As PEP, -- preu_especial_proveedor

bbb.descompte_normal_proveedor As DNP -- descompte_normal_proveedor

FROM
(
SELECT a.id_article, a.preu_venta, b.preu_especial, b.descompte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = fk_article
) aaa
INNER JOIN
(
SELECT
aa.id_article,
aa.fk_tercer,
aa.preu_venta,
aa.descompte As descompte_normal_proveedor,
bb.descompte As descompte_especial_proveedor,
bb.preu_especial As preu_especial_proveedor

FROM (
SELECT a.id_article, a.fk_tercer, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer
) aa
LEFT JOIN (
SELECT
c.id_tercer,
d.descompte,
d.preu_especial

FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer
) bb
ON aa.fk_tercer = bb.id_tercer
) bbb
ON aaa.id_article = bbb.id_article

precio final

SELECT
Id, PEA, DEA, PEP, DEP, DNP, PN,
CASE
WHEN NOT PEA IS NULL THEN PEA
WHEN NOT DEA IS NULL THEN PN * ( 100.0 - DEA ) / 100.0
WHEN NOT PEP IS NULL THEN PEP
WHEN NOT DEP IS NULL THEN PN * ( 100.0 - DEP ) / 100.0
WHEN NOT DNP IS NULL THEN PN * ( 100.0 - DNP ) / 100.0
ELSE PN
END As PrecioFinal
FROM (
SELECT
aaa.id_article As Id,
aaa.preu_venta As PN, -- precio normal
aaa.preu_especial As PEA, -- preu_especial por articulo
aaa.descompte As DEA, -- descuento especial por artículo

bbb.descompte_especial_proveedor As DEP, --
descompte_especial_proveedor
bbb.preu_especial_proveedor As PEP, -- preu_especial_proveedor

bbb.descompte_normal_proveedor As DNP -- descompte_normal_proveedor


FROM
(
SELECT a.id_article, a.preu_venta, b.preu_especial, b.descompte
FROM T_Articles a
LEFT JOIN T_PreusEspecials b ON a.id_article = fk_article
) aaa
INNER JOIN
(
SELECT
aa.id_article,
aa.fk_tercer,
aa.preu_venta,
aa.descompte As descompte_normal_proveedor,
bb.descompte As descompte_especial_proveedor,
bb.preu_especial As preu_especial_proveedor

FROM (
SELECT a.id_article, a.fk_tercer, a.preu_venta, c.descompte
FROM T_Articles a
LEFT JOIN T_Tercers c ON c.id_tercer = a.fk_tercer
) aa
LEFT JOIN (
SELECT
c.id_tercer,
d.descompte,
d.preu_especial

FROM T_Tercers c
INNER JOIN T_PreusEspecials d
ON c.id_tercer = d.fk_tercer
) bb
ON aa.fk_tercer = bb.id_tercer
) bbb
ON aaa.id_article = bbb.id_article
) aaaa

/*
No se si el case es correcto, pero si no al menos tienes todos los
posibles valores de precio/descuento para cada artículo así que te
lo podrás combinar

Saludos y suerte,

Diego Buendia
Barcelona Spain
*/
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida