SQL - Order By Avenzado

 
Vista:
sin imagen de perfil

Order By Avenzado

Publicado por ixtry brust (12 intervenciones) el 08/05/2012 23:44:12
Muchas gracias por la ayuda



mi pregunta consiste en lo siguiente en un almacen tengo los artículos ordenados por nivel,pasillo,sección y charola



en el campo nivel exiten 1,2,3,4

en el campo pasillo exiten ra,rb,rc, a,b,c,d,e,f

en el campo sesión existe 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17

en el campo charola existe a,b,c,d,e,f



necesito realizar un select donde primero ordene por nivel, luego por pasillo iniciando con

ra luego rb, luego rc y luego de la a a la d,después ordenado por sesión y luego por charola



pero no se como hacer la paté donde se ordena el pasillo , he buscado en algunas paginas

pero no he encontrado información acerca de como poner en un order by una condición



espero me puedan orientar





saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Order By Avenzado

Publicado por leonardo_josue (1173 intervenciones) el 09/05/2012 17:32:21
Hola ixtry brust :

¿Con qué Motor de BD estás trabajando? Este es un datos que no debes olvidar mencionar cada que publiques un post en el foro. Aunque las BD trabajan con SQL, la sintaxis puede ser muy diferente para cada uno de ellos, por lo tanto puede ser que las soluciones que te pueda dar no funcionen para el motor que estás utilizando. Mucho ojo para la siguiente.

Algunos motores de BD te permiten utilizar una sentencia CASE-WHEN en la sección ORDER BY. En MySQL podrías hacer algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mysql> SELECT * FROM tabla;
+---------+
| pasillo |
+---------+
| f       |
| ra      |
| d       |
| rb      |
| b       |
| c       |
| a       |
| e       |
| rc      |
+---------+
9 rows in set (0.03 sec)
 
mysql> SELECT * FROM tabla ORDER BY
    -> CASE pasillo
    -> WHEN 'ra' THEN 1
    -> WHEN 'rb' THEN 2
    -> WHEN 'rc' THEN 3
    -> WHEN 'a' THEN 4
    -> WHEN 'b' THEN 5
    -> WHEN 'c' THEN 6
    -> WHEN 'd' THEN 7
    -> WHEN 'e' THEN 8
    -> WHEN 'f' THEN 9
    -> END;
+---------+
| pasillo |
+---------+
| ra      |
| rb      |
| rc      |
| a       |
| b       |
| c       |
| d       |
| e       |
| f       |
+---------+


Otra solución más formal sería que conviertas esta columna en un catálogo de pasillos, donde pongas un atributo orden (que es lo mismo que se está simulando con el case when), es decir algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
mysql> SELECT * FROM tabla;
+---------+
| pasillo |
+---------+
| f       |
| ra      |
| d       |
| rb      |
| b       |
| c       |
| a       |
| e       |
| rc      |
+---------+
9 rows in set (0.03 sec)
mysql> select * from pasillos;
+---------+-------+
| pasillo | orden |
+---------+-------+
| ra      |     1 |
| rb      |     2 |
| rc      |     3 |
| a       |     4 |
| b       |     5 |
| c       |     6 |
| d       |     7 |
| e       |     8 |
| f       |     9 |
+---------+-------+
9 rows in set (0.04 sec)
 
mysql> select tabla.pasillo from tabla
    -> inner join pasillos on tabla.pasillo = pasillos.pasillo
    -> order by pasillos.orden;
+---------+
| pasillo |
+---------+
| ra      |
| rb      |
| rc      |
| a       |
| b       |
| c       |
| d       |
| e       |
| f       |
+---------+
9 rows in set (0.13 sec)


Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Order By Avanzado

Publicado por ixtry brust (12 intervenciones) el 10/05/2012 02:01:38
hola leo muchas gracias por la ayuda y perdona que haga preguntas muy simples pero estoy aprendiendo y actualmente estoy manejando sql

con lo que me contestaste hice el siguiente store

ALTER PROCEDURE [dbo].[Pedidos]
@DocEntry int

AS

BEGIN


SELECT (dbo.ORDR.DocNum), dbo.OWHS.WhsName, dbo.OWHS.Location, dbo.ORDR.Comments, dbo.ORDR.DocEntry, dbo.ORDR.DocDate, dbo.ORDR.DocDueDate,
convert(varchar(5),dateadd(minute,DocTime,0),8)as doctime, dbo.ORDR.CardCode, dbo.ORDR.CardName, dbo.ORDR.Address, dbo.OSHP.TrnspName, dbo.RDR1.U_Pasillo, dbo.RDR1.U_Nivel, dbo.RDR1.U_Seccion,U_Charola ,
dbo.RDR1.U_Stand, dbo.RDR1.U_Lote, dbo.RDR1.U_Fecha, dbo.RDR1.Quantity, dbo.RDR1.Dscription, dbo.RDR1.ItemCode, dbo.RDR1.ShipDate, dbo.RDR1.OpenQty,
dbo.RDR1.U_Onhand, dbo.ORDR.U_Telemarketing, dbo.ORDR.U_Movimiento, dbo.ORDR.U_Origen, dbo.ORDR.U_BXP_Status
FROM dbo.OSHP INNER JOIN
dbo.ORDR ON dbo.OSHP.TrnspCode = dbo.ORDR.TrnspCode INNER JOIN
dbo.RDR1 ON dbo.ORDR.DocEntry = dbo.RDR1.DocEntry INNER JOIN
dbo.OWHS ON dbo.RDR1.WhsCode = dbo.OWHS.WhsCode

WHERE dbo.ORDR.DocEntry = @DocEntry order by --dbo.RDR1.U_Nivel,
CASE dbo.RDR1.U_Pasillo
WHEN 'RA' THEN 1
WHEN 'RB' THEN 2
WHEN 'RC' THEN 3
WHEN 'A' THEN 4
WHEN 'B' THEN 5
WHEN 'C' THEN 6
WHEN 'D' THEN 7
WHEN 'E' THEN 8
WHEN 'F' THEN 9
END--,dbo.RDR1.U_Seccion,U_Charola




END

pero me no me sale ordenado el pasillo
esto es lo que arroja(en los campos del order by)

pasillo nivel seccion charola
G 2 NULL NULL
K 2 NULL NULL
G 3 NULL NULL
G 3 NULL NULL
H 3 NULL NULL
K 1 NULL 2
J 1 NULL 1
G 2 NULL NULL
H 2 NULL NULL
RB 1 NULL 1
A 2 NULL 3
A 2 NULL 3

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Order By Avenzado

Publicado por join (1 intervención) el 06/09/2013 16:18:08
gracias Leonardo Josué, tenia el mismo problema para otro ejemplo, pero en PostgresSQL, con tu ayuda me funciono perfectamente, solo hay que revisar sintaxis del case dependiendo del motor, me quedo así:

SELECT *
FROM tabla ORDER BY
CASE pasillo
WHEN pasillo = 'ra' THEN 1
WHEN pasillo = 'rb' THEN 2
WHEN pasillo = 'rc' THEN 3
WHEN pasillo = 'a' THEN 4
WHEN pasillo = 'b' THEN 5
WHEN pasillo = 'c' THEN 6
WHEN pasillo = 'd' THEN 7
WHEN pasillo = 'e' THEN 8
WHEN pasillo = 'f' THEN 9
END
ORDER BY PASILLO DESC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar