none
Ordenar valores de una consulta RRS feed

  • Pregunta

  • CREATE TABLE #T (
    Estudiante int NOT NULL,
    Cod_Clase varchar(10) NOT NULL,
    Termino int NOT NULL,
    Nota char(1) NOT NULL,
    PRIMARY KEY (Estudiante, Cod_Clase, Termino)
    );
    GO
    INSERT INTO #T (
    	Estudiante,
    	Cod_Clase,
    	Termino,
    	Nota
    	)
    VALUES
        (10, 'R-1', 1701, 'A'),
        (10, 'R-2', 1702, 'A'),
        (10, 'R-3', 1703, 'A'),
        (10, 'R-1', 1705, 'C');
    GO
    DECLARE 
    	@columns nvarchar(MAX),
    	@sql nvarchar(MAX),
    	@num_term int;
    
    SET @num_term = (
    SELECT TOP (1)
    	COUNT(DISTINCT Termino) AS cnt
    FROM
    	#T
    GROUP BY
    	Estudiante,
    	Cod_Clase
    ORDER BY
    	cnt DESC
    );
    
    SET @columns = STUFF(
    (
    SELECT
    	',' + CONCAT(' MAX(CASE WHEN rn = ', n) + ' THEN Nota END) AS ' + QUOTENAME(CONCAT('Nota - ', n)) AS [*]
    FROM
    	dbo.ufn_GetNums(1, @num_term)
    ORDER BY
    	n
    FOR XML PATH(''), TYPE
    ).value('text()[1]', 'varchar(MAX)'), 1, 1, '');
    
    SET @sql = N'
    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Estudiante, Cod_Clase ORDER BY Termino) as rn
    FROM #T
    )
    SELECT
    	R.Estudiante, 
    	R.Cod_Clase, ' + @columns + N'
    FROM
    	R
    GROUP BY
    	R.Estudiante, 
    	R.Cod_Clase;
    ';
    
    EXEC sp_executesql @sql;
    GO
    DROP TABLE #T;
    GO

    Tengo la consulta de arriba que me da perfectamente el resultado que quiero, pero me gustaria si fuera possible ordenar El Campo Cod_Clase en el orden que yo quiera, ejemplo si quiero que se vea primero ver R-2 luego R-1 y luego R-3 osea que yo pueda ordenar el campo Cod_Clave por los valores que yo quiera (no quiero order by Cod_Clase, lo que quiero es ordenar por los valores del campo, gracias

    Estudiante Cod_Clase Nota_1 Nota_2

    10 R-1 A C 10 R-2 A NULL 10 R-3 A NULL


    jueves, 12 de abril de 2018 19:57

Respuestas

  • Si usted lo que desea es un orden arbitrario, tiene que definir primero dicho orden.  En el caso de Cod_Clase, asumiendo que solamente hay valores R-1, R-2 y R-3, puede usar un CTE.

    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Estudiante, Cod_Clase ORDER BY Termino) as rn
    FROM #T
    ), MiOrden As (
        Select
            'R-2' As [Cod_Clase]
            , 1 As [rid]
        Union All
        Select
            'R-1', 2
        Union All
        Select
            'R-3', 3
    )
    SELECT
    	R.Estudiante, 
    	R.Cod_Clase, ' + @columns + N'
    FROM
    	R
            Inner Join
            MiOrden As o
            On R.Cod_Clase = o.Cod_Clase
    GROUP BY
    	R.Estudiante, 
    	R.Cod_Clase
    Order By
            o.rid Asc
    ';

    Si la lista de códigos es extensa, lo mejor es tener una tabla auxiliar que defina los órdenes, o si es posible, que la tabla que define los códigos tenga una columna [Orden] que define el orden de los códigos.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Efrain Diaz viernes, 13 de abril de 2018 13:09
    jueves, 12 de abril de 2018 20:47
  • Para ordenar de forma arbitriaria pudieras adicionar una columna a tu tabla de clases para guardar el orden deseado y unir esta en la select final para poder ordenar.  Otra opcion seria usar una expresion CASE pero si tienes una nueva clase la veras al final.

    SET @sql = N'
    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Estudiante, Cod_Clase ORDER BY Termino) as rn
    FROM #T
    )
    SELECT
    	R.Estudiante, 
    	R.Cod_Clase, ' + @columns + N'
    FROM
    	R
    GROUP BY
    	R.Estudiante, 
    	R.Cod_Clase
    ORDER BY
            R.Estudiante,
            CASE R.Cod_Clase
            WHEN ''R-2'' THEN 1
            WHEN ''R-1'' THEN 2
            WHEN ''R-3'' THEN 3
            ELSE 15
            END;
    ';


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Marcado como respuesta Efrain Diaz viernes, 13 de abril de 2018 13:09
    • Editado HunchbackMVP viernes, 13 de abril de 2018 13:52
    viernes, 13 de abril de 2018 11:59

Todas las respuestas

  • Si usted lo que desea es un orden arbitrario, tiene que definir primero dicho orden.  En el caso de Cod_Clase, asumiendo que solamente hay valores R-1, R-2 y R-3, puede usar un CTE.

    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Estudiante, Cod_Clase ORDER BY Termino) as rn
    FROM #T
    ), MiOrden As (
        Select
            'R-2' As [Cod_Clase]
            , 1 As [rid]
        Union All
        Select
            'R-1', 2
        Union All
        Select
            'R-3', 3
    )
    SELECT
    	R.Estudiante, 
    	R.Cod_Clase, ' + @columns + N'
    FROM
    	R
            Inner Join
            MiOrden As o
            On R.Cod_Clase = o.Cod_Clase
    GROUP BY
    	R.Estudiante, 
    	R.Cod_Clase
    Order By
            o.rid Asc
    ';

    Si la lista de códigos es extensa, lo mejor es tener una tabla auxiliar que defina los órdenes, o si es posible, que la tabla que define los códigos tenga una columna [Orden] que define el orden de los códigos.


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Efrain Diaz viernes, 13 de abril de 2018 13:09
    jueves, 12 de abril de 2018 20:47
  • Para ordenar de forma arbitriaria pudieras adicionar una columna a tu tabla de clases para guardar el orden deseado y unir esta en la select final para poder ordenar.  Otra opcion seria usar una expresion CASE pero si tienes una nueva clase la veras al final.

    SET @sql = N'
    WITH R AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Estudiante, Cod_Clase ORDER BY Termino) as rn
    FROM #T
    )
    SELECT
    	R.Estudiante, 
    	R.Cod_Clase, ' + @columns + N'
    FROM
    	R
    GROUP BY
    	R.Estudiante, 
    	R.Cod_Clase
    ORDER BY
            R.Estudiante,
            CASE R.Cod_Clase
            WHEN ''R-2'' THEN 1
            WHEN ''R-1'' THEN 2
            WHEN ''R-3'' THEN 3
            ELSE 15
            END;
    ';


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Marcado como respuesta Efrain Diaz viernes, 13 de abril de 2018 13:09
    • Editado HunchbackMVP viernes, 13 de abril de 2018 13:52
    viernes, 13 de abril de 2018 11:59