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

"Order by" personalizado ?!?!?!?

Estas en el tema de "Order by" personalizado ?!?!?!? en el foro de SQL Server en Foros del Web. Estimados: Quisiera realizar un select que ordene registros, pero quiero que el primer elemento no respete ese ordenamiento. Por ejemplo, un ordenamiento de registros numericos ...
  #1 (permalink)  
Antiguo 22/12/2009, 05:59
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Información "Order by" personalizado ?!?!?!?

Estimados:

Quisiera realizar un select que ordene registros, pero quiero que el primer elemento no respete ese ordenamiento.

Por ejemplo, un ordenamiento de registros numericos del 1 al 10 en donde quiero que el 8 esté siempre primero:

8
8
1
2
2
3
4
4
4
5
6
6
7
9
9
10

Gracias de antemano XD
  #2 (permalink)  
Antiguo 22/12/2009, 06:17
Avatar de gabrielflowers  
Fecha de Ingreso: julio-2007
Ubicación: Santa Cruz de la Sierra
Mensajes: 187
Antigüedad: 16 años, 9 meses
Puntos: 3
De acuerdo Respuesta: "Order by" personalizado ?!?!?!?

hola, sin conocer la estructura de tu tabla, te propongo la sgte. solucion:
Código:
SELECT * FROM mitabla WHERE campo1=8
UNION
SELECT * FROM mitabla WHERE campo1!=8 ORDER BY campo1 ASC
...como ves estoy mostrando primero los que tiene el campo1 igual a 8 (o lo que quieras), y en seguida los restantes en forma ascendente


saludos....
__________________
"puedo detenerme, pero no retroceder, tengo que avanzar..."
  #3 (permalink)  
Antiguo 22/12/2009, 06:32
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

Gabriel, el problema de tu consulta es que union mezcla los resultados y los ordena a todos en forma ascendente y normal.
  #4 (permalink)  
Antiguo 22/12/2009, 06:50
Avatar de gabrielflowers  
Fecha de Ingreso: julio-2007
Ubicación: Santa Cruz de la Sierra
Mensajes: 187
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: "Order by" personalizado ?!?!?!?

te equivocas sarlac, la union no mezcla resultados, sino que pone los resultados del segundo select a continuacion del primer select, por si acaso ponle parentesis y pruebalo:


SELECT * FROM mitabla WHERE campo1=8
UNION
(SELECT * FROM mitabla WHERE campo1!=8 ORDER BY campo1 ASC)
__________________
"puedo detenerme, pero no retroceder, tengo que avanzar..."
  #5 (permalink)  
Antiguo 22/12/2009, 07:04
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

Pues resulta extraño. Probé tu consulta en mi motor (SQL Server 2000) y resulta que UNION mezcla los registros. Algo parecido vi al buscar documentación en internet sobre Union.

Primero probé con la consulta que quiero mostrar (es un tanto compleja, con muchas tablas y 3 sub-select) y luego la probé en una sola tabla. El resultado era el mismo.

Finalmente resolví el problema, pero utilizando dos consultas separadas usando tu idea;

SELECT * FROM mitabla WHERE campo1=8

SELECT * FROM mitabla WHERE campo1!=8 ORDER BY campo1 ASC


Cada consulta la capturé en php y luego desde ahí las uní en una sola matriz.

Muchas gracias Gabriel, aunque me quedó esa interrogante de UNION en el aire.
  #6 (permalink)  
Antiguo 22/12/2009, 07:14
Avatar de gabrielflowers  
Fecha de Ingreso: julio-2007
Ubicación: Santa Cruz de la Sierra
Mensajes: 187
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: "Order by" personalizado ?!?!?!?

sarlac en realidad sabes la UNION no esta mezclando los registros sino el ORDER BY, como dije la union solo acopla los resultados de un select tras de otro

lo raro que estoy viendo es que cuando haces UNION solo puedes poner un order by y aplica al conjunto de resultados, mas no puedes hacer order by a un select dentro de la union, como te lo propuse....

pero bien me alegro que hayas conseguido solucionar tu problema.
__________________
"puedo detenerme, pero no retroceder, tengo que avanzar..."

Última edición por gabrielflowers; 22/12/2009 a las 07:55
  #7 (permalink)  
Antiguo 22/12/2009, 07:24
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

Si, y al hacerlo me dice que la sintaxis es incorrecta cerca de la palabra clave 'ORDER'
  #8 (permalink)  
Antiguo 22/12/2009, 07:27
Avatar de gabrielflowers  
Fecha de Ingreso: julio-2007
Ubicación: Santa Cruz de la Sierra
Mensajes: 187
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: "Order by" personalizado ?!?!?!?

sarlac en realidad sabes la UNION no esta mezclando los registros sino el ORDER BY, como dije la union solo acopla los resultados de un select tras de otro

lo raro que estoy viendo es que cuando haces UNION solo puedes poner un order by y aplica al conjunto de resultados, mas no puedes hacer order by a un select dentro de la union, como te lo propuse....

pero bien me alegro que hayas conseguido solucionar tu problema.
__________________
"puedo detenerme, pero no retroceder, tengo que avanzar..."

Última edición por gabrielflowers; 22/12/2009 a las 07:54
  #9 (permalink)  
Antiguo 22/12/2009, 07:42
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: "Order by" personalizado ?!?!?!?

Cita:
Iniciado por sarlac98 Ver Mensaje
Finalmente resolví el problema, pero utilizando dos consultas separadas usando tu idea;

SELECT * FROM mitabla WHERE campo1=8

SELECT * FROM mitabla WHERE campo1!=8 ORDER BY campo1 ASC


Cada consulta la capturé en php y luego desde ahí las uní en una sola matriz.

Otra alternativa, sino hacer dos consultas..cuando es 8 se toma como cero.

Código:
SELECT * 
FROM mitabla 
ORDER BY CASE campo1 
         WHEN 8 THEN 0 
         ELSE   campo1 END ASC
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 22/12/2009 a las 08:03
  #10 (permalink)  
Antiguo 22/12/2009, 08:47
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

Excelente solución, excpeto por un pequeño detalle...

En mi caso el ordenamiento se da por el nombre de una tabla, no por ID numérico. Además, el listamiento lo realizo en base a dos campos varchar, un ejemplo vale más que mil palabras:

Este es el ordenamiento al final de la consulta:

Código SQL:
Ver original
  1. ORDER BY Empresa.Nombre , Flota.Nombre

En base a lo de Andrés probé esto sin éxito:

Código SQL:
Ver original
  1. ORDER BY CASE Empresa.Nombre WHEN Empresa.ID = 8 THEN 0
  2.                      ELSE   Empresa.Nombre  END ASC, Flota.Nombre

No tengo experiencia en el uso de esas cláusulas, asi que los errores de sintáxis puede resultar obvio para muchos de uds.
  #11 (permalink)  
Antiguo 22/12/2009, 08:55
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: "Order by" personalizado ?!?!?!?

Entonces lo que hay que pasarle al order by es el nombre y cuando sea el id =8 le pasamos cadena vacia...

Código:
ORDER BY CASE  Empresa.ID  
             WHEN 8 THEN '' ELSE Empresa.Nombre  END ASC, Flota.Nombre
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #12 (permalink)  
Antiguo 22/12/2009, 09:04
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

Excelente Andrés, eso soluciona el problema, pero para que me corriera tuve que quitarle el DISTINCT al select.

Eso me da miedo de que en alguna oportunidad se puedan duplicar registros en la consulta (aunque por los campos que traigo, eso sería casi imposible).

¿He de asumir que los registros no se repetirán sin usar DISTINCT?
  #13 (permalink)  
Antiguo 22/12/2009, 09:07
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: "Order by" personalizado ?!?!?!?

en donde agregaste el distinct?

--

ah lo eliminaste...

puedes ponerle un group by...

o bien para estar mas seguros ponerlo como subconsulta o insertar en una temporal para hacer el distinct ..

aunque en realidad, las llaves y constraints de la bd deben ayudarte en esa parte...si las tablas no tienen, hay que agregarlas..
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #14 (permalink)  
Antiguo 22/12/2009, 09:12
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

al inicio de la consulta:

Código SQL:
Ver original
  1. SELECT    DISTINCT       <muchos campos>
  2.  
  3. FROM         <muchas tablas e INNER joins>
  4.  
  5. WHERE     <muchas condiciones y sub-selects>
  6.  
  7. ORDER BY Empresa.Nombre , Flota.Nombre


Al final lo dejé así para implementar tu solución:


Código SQL:
Ver original
  1. SELECT     <muchos campos>
  2.  
  3. FROM         <muchas tablas e INNER joins>
  4.  
  5. WHERE     <muchas condiciones y sub-selects>
  6.  
  7. ORDER BY CASE Empresa.ID WHEN 10 THEN '' ELSE Empresa.Nombre END ASC, Flota.Nombre
  #15 (permalink)  
Antiguo 22/12/2009, 09:14
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: "Order by" personalizado ?!?!?!?

Excelente!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #16 (permalink)  
Antiguo 22/12/2009, 09:19
 
Fecha de Ingreso: diciembre-2009
Mensajes: 18
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: "Order by" personalizado ?!?!?!?

Muchas gracias Gabriel y Andrés por su ayuda.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 18:34.