Principales respuestas
SQL - ORDENAR CODIGOS POR TALLAS

Pregunta
-
Buenos dias, como puedo ordenar una lista de codigos por tallas, lineas abajo tengo los codigos de mi bd, la idea es que el orden sea de acuerdo a la talla por ejemplo; se sabe que la talla S es primero, luego sigue la talla M y de ahi la talla L y asi sucesivamente, como puedo ordenar esos tipos de codigos.
F78.468-NEG-M
F50.931-JEAB-34
F78.468-NEG-S
F78.468-NEG-XL
F78.468-ROJ-L
F78.468-ROJ-M
F78.468-ROJ-S
F78.468-ROJ-XL
F50.931-JEAB-36
F50.931-JEAB-38
Respuestas
-
Deberas usar un ordenamiento customizado usando la expresion CASE.
DECLARE @T table ( codigo varchar(50) ); INSERT INTO @T (codigo) VALUES ('F78.468-NEG-M'), ('F78.468-NEG-S'), ('F78.468-NEG-XL'), ('F78.468-ROJ-L'), ('F78.468-ROJ-M'), ('F78.468-ROJ-S'), ('F78.468-ROJ-XL'), ('F50.931-JEAB-34'), ('F50.931-JEAB-36'), ('F50.931-JEAB-38'); SELECT T.codigo, R1.pos_ultimo_guion, R2.col1, R2.col2 FROM @T AS T CROSS APPLY ( SELECT CHARINDEX('-', REVERSE(T.codigo)) AS pos_ultimo_guion ) AS R1 CROSS APPLY ( SELECT STUFF(T.codigo, LEN(T.codigo) - R1.pos_ultimo_guion, 50, '') AS col1, CASE WHEN R1.pos_ultimo_guion > 0 THEN RIGHT(T.codigo, R1.pos_ultimo_guion - 1) END AS col2 ) AS R2 ORDER BY R2.col1, CASE WHEN R2.col2 = 'S' THEN 1 WHEN R2.col2 = 'M' THEN 2 WHEN R2.col2 = 'L' THEN 3 WHEN R2.col2 = 'XL' THEN 4 WHEN R2.col2 = 'XXL' THEN 5 ELSE 6 END, R2.col2, T.codigo;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Editado HunchbackMVP miércoles, 22 de marzo de 2017 16:04
- Marcado como respuesta Oscar Perez 1234 miércoles, 22 de marzo de 2017 16:46
Todas las respuestas
-
Deberas usar un ordenamiento customizado usando la expresion CASE.
DECLARE @T table ( codigo varchar(50) ); INSERT INTO @T (codigo) VALUES ('F78.468-NEG-M'), ('F78.468-NEG-S'), ('F78.468-NEG-XL'), ('F78.468-ROJ-L'), ('F78.468-ROJ-M'), ('F78.468-ROJ-S'), ('F78.468-ROJ-XL'), ('F50.931-JEAB-34'), ('F50.931-JEAB-36'), ('F50.931-JEAB-38'); SELECT T.codigo, R1.pos_ultimo_guion, R2.col1, R2.col2 FROM @T AS T CROSS APPLY ( SELECT CHARINDEX('-', REVERSE(T.codigo)) AS pos_ultimo_guion ) AS R1 CROSS APPLY ( SELECT STUFF(T.codigo, LEN(T.codigo) - R1.pos_ultimo_guion, 50, '') AS col1, CASE WHEN R1.pos_ultimo_guion > 0 THEN RIGHT(T.codigo, R1.pos_ultimo_guion - 1) END AS col2 ) AS R2 ORDER BY R2.col1, CASE WHEN R2.col2 = 'S' THEN 1 WHEN R2.col2 = 'M' THEN 2 WHEN R2.col2 = 'L' THEN 3 WHEN R2.col2 = 'XL' THEN 4 WHEN R2.col2 = 'XXL' THEN 5 ELSE 6 END, R2.col2, T.codigo;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Editado HunchbackMVP miércoles, 22 de marzo de 2017 16:04
- Marcado como respuesta Oscar Perez 1234 miércoles, 22 de marzo de 2017 16:46
-
Hunchback, con estos codigos no me sale.
F50.931-JEAB-10
F50.931-JEAB-4
F50.931-JEAB-6
F78.468-NEG-S
F78.468-NEG-M
F78.468-NEG-XL
F78.468-ROJ-S
F78.468-ROJ-M
F78.468-ROJ-L
F78.468-ROJ-XLsi lo ves, lo que termina el letra lo ordena perfecto, pero en el caso de tallas con numeros es ahi el problema.
- Editado Oscar Perez 1234 miércoles, 22 de marzo de 2017 17:03
-
-
Oscar,
La proxima vez usa el mismo script que yo peque. De esa forma no tengo que recrear tablas y datos.
El problema con los numeros es que la comparacion de caracteres es caracter por caracter y obviamente el 1 del 10 es menor que el 4 y por lo tanto o conviertes a numerico o rellenas con ceros a la izquierda para dar igual formato a todos los numeros por los que deseas ordenar.
DECLARE @T table ( codigo varchar(50) ); INSERT INTO @T (codigo) VALUES ('F78.468-NEG-M'), ('F78.468-NEG-S'), ('F78.468-NEG-XL'), ('F78.468-ROJ-L'), ('F78.468-ROJ-M'), ('F78.468-ROJ-S'), ('F78.468-ROJ-XL'), ('F50.931-JEAB-10'), ('F50.931-JEAB-4'), ('F50.931-JEAB-6'); SELECT T.codigo, R1.pos_ultimo_guion, R2.col1, R2.col2 FROM @T AS T CROSS APPLY ( SELECT CHARINDEX('-', REVERSE(T.codigo)) AS pos_ultimo_guion ) AS R1 CROSS APPLY ( SELECT STUFF(T.codigo, LEN(T.codigo) - R1.pos_ultimo_guion, 50, '') AS col1, CASE WHEN R1.pos_ultimo_guion > 0 THEN RIGHT(T.codigo, R1.pos_ultimo_guion - 1) END AS col2 ) AS R2 ORDER BY R2.col1, CASE WHEN R2.col2 = 'S' THEN 1 WHEN R2.col2 = 'M' THEN 2 WHEN R2.col2 = 'L' THEN 3 WHEN R2.col2 = 'XL' THEN 4 WHEN R2.col2 = 'XXL' THEN 5 WHEN R2.col2 NOT LIKE '%[^0-9]%' THEN RIGHT('00000' + R2.col2, 5) ELSE 6 END, R2.col2, T.codigo;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas