SELECT Condicional

14/11/2003 - 17:54 por Antonio Ortiz | Informe spam
Alguien que me puede aclarar por favor, se trate de un Select que obtenga en
una columna el valor mas bajo de 3 campos

Ejemplo:

Producto,CostoProv1(A),CostoProv2, CostoProv3
X,50,52,49
Y,20,21,22
Z,33,32,33

El resultado debera ser:
X,49,C (o 3)
Y,18,A (o 1)
Z,32,B (o 2)

Gracias de antemano

Antonio Ortiz Ramirez
asesor en sistemas
ant@aortiz.net.nospam
www.aortiz.net
www.progvisual.com

Preguntas similare

Leer las respuestas

#1 Javier Loria
14/11/2003 - 21:56 | Informe spam
Hola Antonio:
Sera posible que en la segunda fila te equivocaras y usaras 18 en vez de
20?.
Si es asi tal vez la siguiente consulta te sirve:
SELECT X.Producto,
CASE WHEN ((CostoProv1=<CostoProv2) AND
(CostoProv1=<CostoProv3)) THEN
CostoProv1
WHEN (CostoProv2=<CostoProv3) THEN CostoProv2
ELSE CostoProv3
END AS Costo,
CASE WHEN ((CostoProv1=<CostoProv2) AND
(CostoProv1=<CostoProv3)) THEN
'A'
WHEN (CostoProv2=<CostoProv3) THEN 'B'
ELSE 'C'
END AS SelCosto
FROM X
Este tipo de diseno de tablas como no esta normalizado, produce muchos
dolores de cabeza, incluyendo la necesidad de SQL "creativo".
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.

Antonio Ortiz escribio:
Alguien que me puede aclarar por favor, se trate de un Select que
obtenga en una columna el valor mas bajo de 3 campos

Ejemplo:

Producto,CostoProv1(A),CostoProv2, CostoProv3
X,50,52,49
Y,20,21,22
Z,33,32,33

El resultado debera ser:
X,49,C (o 3)
Y,18,A (o 1)
Z,32,B (o 2)

Gracias de antemano

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net
www.progvisual.com
Respuesta Responder a este mensaje
#2 dbuendiab
15/11/2003 - 00:03 | Informe spam
"Antonio Ortiz" wrote in message news:<#...
Alguien que me puede aclarar por favor, se trate de un Select que obtenga en
una columna el valor mas bajo de 3 campos

Ejemplo:

Producto,CostoProv1(A),CostoProv2, CostoProv3
X,50,52,49
Y,20,21,22
Z,33,32,33

El resultado debera ser:
X,49,C (o 3)
Y,18,A (o 1)
Z,32,B (o 2)




Select
Producto,
Case
When CP1 <= CP2 And CP1 <= CP3 Then CP1
When CP2 <= CP1 And CP2 <= CP3 Then CP2
When CP3 <= CP1 And CP3 <= CP2 Then CP3
End As Costo,
Case
When CP1 <= CP2 And CP1 <= CP3 Then 'A'
When CP2 <= CP1 And CP2 <= CP3 Then 'B'
When CP3 <= CP1 And CP3 <= CP2 Then 'C'
End As Prov
From Tabla

Saludos,

Diego Buendia
Barcelona Spain
Respuesta Responder a este mensaje
#3 Antonio Ortiz
16/11/2003 - 18:14 | Informe spam
Asi es, el valor deberia ser 20. En cuanto a la normalizacion, todas las
tablas del sistema fueron llevadas a un control minimo de 3ra forma normal.
En algunos casos como esto, se opto por la optimizacion para velocidad y
disminuir la complejidad del codigo, pues se trata de una tabla de articulos
con no mas de 3 proveedores y 3 costo (1 por cada prov.), es por esto que no
se creo una tabla de costos por proveedor. (Aunque si existe un catalogo de
proveedores).

Gracias por tus comentarios.

Antonio Ortiz Ramirez

www.aortiz.net
www.progvisual.com


"Javier Loria" escribió en el mensaje
news:
Hola Antonio:
Sera posible que en la segunda fila te equivocaras y usaras 18 en vez


de
20?.
Si es asi tal vez la siguiente consulta te sirve:
SELECT X.Producto,
CASE WHEN ((CostoProv1=<CostoProv2) AND
(CostoProv1=<CostoProv3)) THEN
CostoProv1
WHEN (CostoProv2=<CostoProv3) THEN


CostoProv2
ELSE CostoProv3
END AS Costo,
CASE WHEN ((CostoProv1=<CostoProv2) AND
(CostoProv1=<CostoProv3)) THEN
'A'
WHEN (CostoProv2=<CostoProv3) THEN 'B'
ELSE 'C'
END AS SelCosto
FROM X
Este tipo de diseno de tablas como no esta normalizado, produce muchos
dolores de cabeza, incluyendo la necesidad de SQL "creativo".
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.

Antonio Ortiz escribio:
> Alguien que me puede aclarar por favor, se trate de un Select que
> obtenga en una columna el valor mas bajo de 3 campos
>
> Ejemplo:
>
> Producto,CostoProv1(A),CostoProv2, CostoProv3
> X,50,52,49
> Y,20,21,22
> Z,33,32,33
>
> El resultado debera ser:
> X,49,C (o 3)
> Y,18,A (o 1)
> Z,32,B (o 2)
>
> Gracias de antemano
>
> Antonio Ortiz Ramirez
> asesor en sistemas
>
> www.aortiz.net
> www.progvisual.com


Respuesta Responder a este mensaje
#4 Jupagose
17/11/2003 - 03:11 | Informe spam
Creo que lo mas adecuado es que uses una subconsulta...
donde la parte interna de la consulta hayas los minimos
de cada campo.. y en la parte mas externa obtienes el
minimo de los 3: ALGO SIMILAR A ESTO

select min(costo) from
(select min(x) as costo from t1
union
select min(y) as costo from t2
union
select min(z) as costo from t3 ) as t4

Creo que esto te podria ayudar a resolver le problema de
forma general







Alguien que me puede aclarar por favor, se trate de un


Select que obtenga en
una columna el valor mas bajo de 3 campos

Ejemplo:

Producto,CostoProv1(A),CostoProv2, CostoProv3
X,50,52,49
Y,20,21,22
Z,33,32,33

El resultado debera ser:
X,49,C (o 3)
Y,18,A (o 1)
Z,32,B (o 2)

Gracias de antemano

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net
www.progvisual.com


.

Respuesta Responder a este mensaje
#5 Javier Loria
17/11/2003 - 18:23 | Informe spam
Hola Antonio:
Disculpa pero el diseno NO CUMPLE con la 1ra Forma Normal.
La primera forma Normal exige que las Tablas no tengan grupos repetidos
y que cada columna sea escalar/atomica y no un arreglo o lista de algo con
su propia estructura.
Cuando creas una Tabla con columnas como CostoProv1, CostoProv2 y
CostoProv3 estas precisamente creando un arreglo y violando la 1ra Forma
Normal.
Con respecto a la reduccion de complejidad del codigo, la misma
funcionalidad hubiera podido ser lograda con una Tabla de Costos
Normalizados de la siguiente forma:
SELECT X.Producto,
MIN(Y.CostoArticulo)
FROM X JOIN Y
ON X.Producto=Y.Producto
Que considero es bastante mas sencillo que el codigo del CASE.
Por otra parte si luegon le agregan a los requerimientos que no sean 3
sino 5 proveedores, el CASE se vuelve demasiado largo.
Espero te sirviera el codigo, aunque preferia que te sirvieran los
comentarios :)
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.



forma normalAntonio Ortiz escribio:
Asi es, el valor deberia ser 20. En cuanto a la normalizacion, todas
las tablas del sistema fueron llevadas a un control minimo de 3ra
forma normal. En algunos casos como esto, se opto por la optimizacion
para velocidad y disminuir la complejidad del codigo, pues se trata
de una tabla de articulos con no mas de 3 proveedores y 3 costo (1
por cada prov.), es por esto que no se creo una tabla de costos por
proveedor. (Aunque si existe un catalogo de proveedores).

Gracias por tus comentarios.

Antonio Ortiz Ramirez

www.aortiz.net
www.progvisual.com


"Javier Loria" escribió en el mensaje
news:
Hola Antonio:
Sera posible que en la segunda fila te equivocaras y usaras 18
en vez de 20?.
Si es asi tal vez la siguiente consulta te sirve:
SELECT X.Producto,
CASE WHEN ((CostoProv1=<CostoProv2) AND
(CostoProv1=<CostoProv3))
THEN CostoProv1
WHEN (CostoProv2=<CostoProv3) THEN
CostoProv2 ELSE CostoProv3
END AS Costo,
CASE WHEN ((CostoProv1=<CostoProv2) AND
(CostoProv1=<CostoProv3))
THEN 'A'
WHEN (CostoProv2=<CostoProv3) THEN 'B'
ELSE 'C'
END AS SelCosto
FROM X
Este tipo de diseno de tablas como no esta normalizado, produce
muchos dolores de cabeza, incluyendo la necesidad de SQL "creativo".
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.

Antonio Ortiz escribio:
Alguien que me puede aclarar por favor, se trate de un Select que
obtenga en una columna el valor mas bajo de 3 campos

Ejemplo:

Producto,CostoProv1(A),CostoProv2, CostoProv3
X,50,52,49
Y,20,21,22
Z,33,32,33

El resultado debera ser:
X,49,C (o 3)
Y,18,A (o 1)
Z,32,B (o 2)

Gracias de antemano

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net
www.progvisual.com
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida