none
SQL - ORDENAR CODIGOS POR TALLAS RRS feed

  • 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
    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

    miércoles, 22 de marzo de 2017 15:42

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


    miércoles, 22 de marzo de 2017 16:02

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


    miércoles, 22 de marzo de 2017 16:02
  • 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-XL

    si lo ves, lo que termina el letra lo ordena perfecto, pero en el caso de tallas con numeros es ahi el problema.


    miércoles, 22 de marzo de 2017 17:03
  • Sabes lo que hice fue agregar en el case las tallas, y ahora si me ordena muchas gracias por al ayuda.
    miércoles, 22 de marzo de 2017 17:21
  • 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

    miércoles, 22 de marzo de 2017 17:28