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

#6 Antonio Ortiz
18/11/2003 - 19:31 | Informe spam
Ok, lo tendre en consideracion en el proximo diseño.

Gracias,

Antonio Ortiz Ramirez
asesor en sistemas

www.aortiz.net


"Javier Loria" escribió en el mensaje
news:OUpYE#
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


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida