none
agrupar en consulta sql RRS feed

  • Pregunta

  • Tabla matricula_Detalles

    Num_Matricula     Num_Estudiante     Codigo_Clase     Baja              Termino

             26                   1010                Reco_215           False               1601

             26                   1010                Reco_220           False               1601

             27                   1111                Reco_215            False              1601

             27                   1111                Reco_220           True                1601

    select A.num_estudiante,A.baja
    from Matricula_Detalles_Tabla A
    where A.termino = 1601
    group by A.baja,A.Num_Estudiante
    order by a.Num_Estudiante

    no quiero que me repita el num_estudiante y me esta repitiendo el estudiante 1111 por que tiene una clase en Baja true y la otra false

    viernes, 10 de febrero de 2017 18:48

Respuestas

  • Efrain Diaz,

    Recién es que dejas claro lo que requieres.

    SELECT 
        A.num_estudiante,
        CONVERT(bit, MAX(CONVERT(int, A.Baja)))
    FROM Matricula_Detalles_Tabla A
    WHERE A.termino = 1601
    GROUP BY A.Num_Estudiante
    ORDER BY A.Num_Estudiante


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Efrain Diaz sábado, 11 de febrero de 2017 18:59
    viernes, 10 de febrero de 2017 20:19

Todas las respuestas

  • Si no quieres que te repita el num_estudiante, tienes que agrupar solo por estudiante, no por baja. Si agrupas por las dos cosas, le estás pidiendo que te dé todas las posibles combinaciones de estudiante y baja, por lo que es razonable que te devuelva las dos parejas (1111,true) y (1111,false). Y si quieres que solo te saque una vez cada estudiante, tienes que decidir cuál es el criterio que quieres seguir en caso de que el estudiante tenga true y false en baja. ¿Cómo decides cuál de los dos valores quieres mostrar?
    viernes, 10 de febrero de 2017 18:52
  • si no agrupo por el numero de la baja tambien la consulta me tira un error de hecho no me permite hacer eso, me puedes dar una idea de como hacerlo
    viernes, 10 de febrero de 2017 18:54
  • quiero que saque todos los estudiantes pero que indistintamente tenga true o false en la columna baja quiero que me lo mueste solo una vez, es eso posible
    viernes, 10 de febrero de 2017 18:56
  • Efrain Diaz,

    Si el valor de la columna [Baja] es irrelevante, ¿cuál es la necesidad de mostrarlo?

    SELECT A.num_estudiante
    FROM Matricula_Detalles_Tabla A
    WHERE A.termino = 1601
    GROUP BY A.Num_Estudiante
    ORDER BY A.Num_Estudiante

    Lo mismo podría funcionar con la instrucción DISTINCT.

    Por otro lado, en el ejemplo que muestras el alumno 1111 tiene dos valores distintos para la columna [Baja] ¿cuál deseas mostrar? ¿sólo False? ¿sólo True? ¿ambos?

    SELECT 
        A.Num_Estudiante, 
        CASE WHEN COUNT(DISTINCT A.Baja) = 1 THEN MAX(A.Baja) ELSE 'False/True' END
    FROM Matricula_Detalles_Tabla A
    WHERE A.termino = 1601
    GROUP BY A.Num_Estudiante
    ORDER BY A.Num_Estudiante


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 10 de febrero de 2017 19:12
  • quiero que saque todos los estudiantes pero que indistintamente tenga true o false en la columna baja quiero que me lo mueste solo una vez, es eso posible

    Sí, es posible si a esa columna le pones una función de agrupación, como por ejemplo MAX:

    select A.num_estudiante, MAX(A.baja) as baja
    from Matricula_Detalles_Tabla A
    where A.termino = 1601
    group by A.Num_Estudiante
    order by a.Num_Estudiante

    Si el estudiante solo tiene un único valor de baja (true o false), el MAX mostrará precisamente ese único valor. Si tiene los dos valores, presentará el mayor de los dos, que resulta ser True.

    • Propuesto como respuesta HunchbackMVP viernes, 10 de febrero de 2017 20:56
    • Votado como útil Joyce_ACModerator lunes, 13 de febrero de 2017 17:00
    viernes, 10 de febrero de 2017 19:27
  • lo primero es que quiero mostrar todos los estudiantes no importa si el valor de la Baja es true or false, lo que no quiero es que repita el estudiante y si tiene uno de los valores true me muestre el true y ovie el false.... a ver si me entiendes
    viernes, 10 de febrero de 2017 19:53
  • Msg 8117, Level 16, State 1, Line 3

    Operand data type bit is invalid for max operator.

    William me da el siguiente error

    viernes, 10 de febrero de 2017 20:13
  • Efrain Diaz,

    Recién es que dejas claro lo que requieres.

    SELECT 
        A.num_estudiante,
        CONVERT(bit, MAX(CONVERT(int, A.Baja)))
    FROM Matricula_Detalles_Tabla A
    WHERE A.termino = 1601
    GROUP BY A.Num_Estudiante
    ORDER BY A.Num_Estudiante


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Efrain Diaz sábado, 11 de febrero de 2017 18:59
    viernes, 10 de febrero de 2017 20:19
  • lo primero es que quiero mostrar todos los estudiantes no importa si el valor de la Baja es true or false, lo que no quiero es que repita el estudiante y si tiene uno de los valores true me muestre el true y ovie el false.... a ver si me entiendes


    Trata:

    with R as (
    select 
        *, 
        rank() over(
        partition by num_estudiante
        order by baja DESC
        ) as rn
    from matricula_detalles
    where termino = 1601
    )
    select *
    from R
    where rn = 1;

    La idea es enumerar comenzando con baja = "true" por lo que si no existe esa condicion para un estudiante dado entonces tomara la sgte que seria baja = "false". Si existe la condicion entonces el resto de fila existentes no se tomaran en cuenta.

    Si el estudiante esta de baja en otra clase entonces se repetira.

    Pudieramos para ese caso usar el operador EXISTS.

    DECLARE @T table (
    Num_Matricula int,
    Num_Estudiante int, 
    Codigo_Clase varchar(15),
    Baja varchar(5),
    Termino int,
    PRIMARY KEY (Termino, Codigo_Clase, Num_Estudiante)
    )
    
    INSERT INTO @T
        (
         Num_Matricula,
         Num_Estudiante,
         Codigo_Clase,
         Baja,
    	 Termino
        )
    VALUES
        (26, 1010, 'Reco_215', 'False', 1601),
    	(26, 1010, 'Reco_220', 'False', 1601),
    	(27, 1111, 'Reco_215', 'False', 1601),
    	(27, 1111, 'Reco_220', 'True', 1601),
    	(27, 1111, 'Reco_225', 'True', 1601);
    
    WITH R AS (
    SELECT
    	*,
    	RANK() OVER(
    	PARTITION BY Num_Estudiante
    	ORDER BY Baja DESC
    	) AS rn
    FROM
    	@T
    WHERE
    	Termino = 1601
    )
    SELECT
    	*
    FROM
    	R
    WHERE
    	rn = 1
    ORDER BY
    	R.Num_Estudiante,
    	R.Termino,
    	R.Codigo_Clase;
    
    SELECT
    	*
    FROM
    	@T AS A
    WHERE
    	A.Termino = 1601
    	AND NOT EXISTS (
    	SELECT
    		*
    	FROM
    		@T AS B
    	WHERE
    		B.Termino = A.Termino
    		AND
            (
    		(B.baja = 'True' AND B.Codigo_Clase < A.Codigo_Clase AND A.baja = 'True' AND B.Num_Estudiante = A.Num_Estudiante)
    		OR
    		(B.baja = 'True' AND A.baja = 'False' AND B.Num_Estudiante = A.Num_Estudiante)
    		)
    	);
    GO



    AMB

    Some guidelines for posting questions...

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



    viernes, 10 de febrero de 2017 20:22