Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Order By

Estas en el tema de Order By en el foro de SQL Server en Foros del Web. Saludos a todo el foro. Mi duda es: como se puede hacer un orden dinamico en una consulta pero con todo y orden con respecto ...
  #1 (permalink)  
Antiguo 15/03/2006, 11:07
 
Fecha de Ingreso: enero-2006
Mensajes: 169
Antigüedad: 18 años, 3 meses
Puntos: 0
Pregunta Order By

Saludos a todo el foro.

Mi duda es: como se puede hacer un orden dinamico en una consulta pero con todo y orden con respecto a ascendente y descendente, les pongo m,i codigo para que me entiendan.

order by CASE @filtro WHEN 'fecha' THEN ord.Fecha ELSE NULL END,
CASE @filtro WHEN 'status' THEN ord.status ELSE NULL END,
CASE @filtro WHEN 'coordinacion' THEN ord.id_coord ELSE NULL END


Esta parte hace el orden dinamico pero como diseño este mismo codigo para que tambien lo ordene en ascendente o descendente, dependiendo de una variable que el usuario escoge en un formulario.
__________________
"La adulación es una moneda que empobrece al que la recibe"
  #2 (permalink)  
Antiguo 15/03/2006, 15:36
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Lo más directo es anidando más CASE dentro de los ya existentes.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 15/03/2006, 15:46
 
Fecha de Ingreso: enero-2006
Mensajes: 169
Antigüedad: 18 años, 3 meses
Puntos: 0
Ya lo intente anidando mas case dentro de los principales case y solo me manda error
__________________
"La adulación es una moneda que empobrece al que la recibe"
  #4 (permalink)  
Antiguo 16/03/2006, 15:16
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Probablemente lo estás anidando mal. Yo lo he hecho infinidad de veces.

Prueba algo como:

CASE when cosa = 'algo' THEN
CASE WHEN otracosa='otracosa' THEN 'esotracosa' ELSE 'noesotracosa' END
ELSE
CASE WHEN otracosa='otracosa' THEN 'esotracosa' ELSE 'noesotracosa' END
END
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 16/03/2006, 17:34
 
Fecha de Ingreso: enero-2006
Mensajes: 169
Antigüedad: 18 años, 3 meses
Puntos: 0
Asi es como lo estoy anidando debido a tu sugerencia Mithrandir:

order by CASE WHEN @filtro='fFecha' THEN
CASE WHEN @orden='descendente' THEN ord.Fecha desc ELSE NULL END
ELSE
CASE WHEN @orden='ascendente' THEN ord.Fecha asc ELSE NULL END
END

y me da este error:
Servidor: mensaje 156, nivel 15, estado 1, línea 47
Incorrect syntax near the keyword 'desc'.

Tambien lo intente asi:
order by CASE WHEN @filtro='fFecha' THEN
CASE WHEN @orden='descendente' THEN ord.Fecha ELSE NULL END desc
ELSE
CASE WHEN @orden='ascendente' THEN ord.Fecha ELSE NULL END asc
END

y me da el mismo error, si lo intente asi es por que manualmente, es decir sin utilizar una variable me funciona bien, te pongo el codigo que me funciona sin variable.

CASE @filtro WHEN 'fFecha' THEN ord.Fecha ELSE NULL END desc,
CASE @filtro WHEN 'fStatus' THEN ord.status ELSE NULL END desc,
CASE @filtro WHEN 'fCoord' THEN ord.id_coord ELSE NULL END desc,
CASE @filtro WHEN 'fMpio' THEN mu.municipio ELSE NULL END desc,
CASE @filtro WHEN 'fArea' THEN ord.idarea ELSE NULL END desc

Pero así siempre sería descendente y lo que quiero es recoger una variable que le usuario escoja y dependiendo de esa variable lo ordene ascendente o descendente. El filtro de orden para que dependiendo de lo que escoge el usuario ordene los resultados ya esta, es lo que puse arriba solo falta poner algo "dinamico" (por medio de una variable) para que lo ordene de manera ascendente o descendente segun escoja el usuario.

Alguna sugerencia?

Saludos y gracias de antemano
__________________
"La adulación es una moneda que empobrece al que la recibe"
  #6 (permalink)  
Antiguo 17/03/2006, 09:16
 
Fecha de Ingreso: enero-2006
Mensajes: 169
Antigüedad: 18 años, 3 meses
Puntos: 0
Ya lo solucione con las ideas frescas de la maravillosa mañana. Ahora mi pregunta hay alguna manera de reducir el código y quede mas simplificado?

Este es le código:

CASE @filtro WHEN 'fFecha asc' THEN ord.Fecha ELSE NULL END asc,
CASE @filtro WHEN 'fFecha desc' THEN ord.Fecha ELSE NULL END desc,
CASE @filtro WHEN 'fStatus asc' THEN ord.status ELSE NULL END asc,
CASE @filtro WHEN 'fStatus desc' THEN ord.status ELSE NULL END desc,
CASE @filtro WHEN 'fCoord asc' THEN ord.id_coord ELSE NULL END asc,
CASE @filtro WHEN 'fCoord desc' THEN ord.id_coord ELSE NULL END desc,
CASE @filtro WHEN 'fMpio asc' THEN mu.municipio ELSE NULL END asc,
CASE @filtro WHEN 'fMpio desc' THEN mu.municipio ELSE NULL END desc,
CASE @filtro WHEN 'fArea asc' THEN ord.idarea ELSE NULL END asc,
CASE @filtro WHEN 'fArea desc' THEN ord.idarea ELSE NULL END desc
__________________
"La adulación es una moneda que empobrece al que la recibe"
  #7 (permalink)  
Antiguo 17/03/2006, 15:08
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Pues yo sigo viendo un error ahí. Estás metiendo los campos directamente, y no como cadenas para el SQL dinámico que pretendes ejecutar.

Necesitas algo como:
CASE @filtro WHEN 'fFecha asc' THEN ' ord.Fecha ASC ' ELSE NULL END
....

Al final ejecutas la cadena generada con EXEC sp_executesql @sql, aunque imagino que esa parte ya la dominas.

Una vez que consigas hacer ejecutar el código sin errores vemos como lo puedes optimizar.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 22/03/2006, 12:28
 
Fecha de Ingreso: enero-2006
Mensajes: 169
Antigüedad: 18 años, 3 meses
Puntos: 0
Asi como te puse el código funciona, como dato te dijo que no estoy utilizando SQL dinámico.
__________________
"La adulación es una moneda que empobrece al que la recibe"
  #9 (permalink)  
Antiguo 22/03/2006, 15:18
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
La manera más simple implica usar sql dinamico:

en lugar de "fFecha" haz que el indicador sea directamente el nombre del campo, de manera que recibas "ord.Fecha asc", "ord.status desc", etc.

De esa manera es simple cuestión de agregar la coletilla al final de la sentencia SQL. Aunque eso te lleva a las desventajas del sql dinámico.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:10.