none
consulta para agrupar criterios de evaluacion

    Question

  • Hola a todos, necesito agrupar los criterios en una sola consulta ordenados, a continuacion le dejo , un script de prueba

    USE master
    GO
    CREATE DATABASE PRUEBA
    GO
    USE PRUEBA
    GO
    CREATE TABLE [dbo].[curso](
    	[id_curso] [int] IDENTITY(1,1) NOT NULL,
    	[des_curso] [nvarchar](100) NULL,
     CONSTRAINT [PK_curso] PRIMARY KEY CLUSTERED 
    (
    	[id_curso] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[Criterio](
    	[IdCriterio] [int] IDENTITY(1,1) NOT NULL,
    	[DesCriterio] [nvarchar](50) NULL,
     CONSTRAINT [PK_Criterio] PRIMARY KEY CLUSTERED 
    (
    	[IdCriterio] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[evaluacion](
    	[idEvaluacion] [int] IDENTITY(1,1) NOT NULL,
    	[id_Curso] [int] NULL,
    	[idCriterio] [int] NULL,
    	[nota] [real] NULL,
    	[IdEstudiante] [int] NULL,
     CONSTRAINT [PK_evaluacion] PRIMARY KEY CLUSTERED 
    (
    	[idEvaluacion] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[evaluacion]  WITH CHECK ADD  CONSTRAINT [FK_evaluacion_Criterio] FOREIGN KEY([idCriterio])
    REFERENCES [dbo].[Criterio] ([IdCriterio])
    GO
    ALTER TABLE [dbo].[evaluacion] CHECK CONSTRAINT [FK_evaluacion_Criterio]
    GO
    ALTER TABLE [dbo].[evaluacion]  WITH CHECK ADD  CONSTRAINT [FK_evaluacion_curso] FOREIGN KEY([id_Curso])
    REFERENCES [dbo].[curso] ([id_curso])
    GO
    ALTER TABLE [dbo].[evaluacion] CHECK CONSTRAINT [FK_evaluacion_curso]
    GO
    ALTER TABLE [dbo].[evaluacion]  WITH CHECK ADD  CONSTRAINT [FK_evaluacion_Estudiante] FOREIGN KEY([IdEstudiante])
    REFERENCES [dbo].[Estudiante] ([IdEstudiante])
    GO
    ALTER TABLE [dbo].[evaluacion] CHECK CONSTRAINT [FK_evaluacion_Estudiante]
    GO
    CREATE TABLE [dbo].[Estudiante](
    	[IdEstudiante] [int] IDENTITY(1,1) NOT NULL,
    	[NombEstudiante] [nvarchar](100) NULL,
     CONSTRAINT [PK_Estudiante] PRIMARY KEY CLUSTERED 
    (
    	[IdEstudiante] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO


    go
    --insert curso
    go
    insert into curso  values('Matematica')
    insert into curso  values('lenguaje')
    go
    --insert criterio
    go
    insert into  criterio  values('Pactica1')
    insert into  criterio  values('Pactica2')
    insert into  criterio  values('Pactica3')
    go
    --insert estudiante
    go
    insert into   estudiante  values('guillermotaylor')
    insert into   estudiante  values('Hunchback')
    insert into   estudiante  values('qwalgrande')
    go
    --insert evaluacion
    go
    insert into evaluacion values(1,1,15,1)
    insert into evaluacion values(1,1,16,2)
    insert into evaluacion values(1,1,16,3)
    insert into evaluacion values(1,2,15,1)
    insert into evaluacion values(1,2,16,2)
    insert into evaluacion values(1,2,16,3)
    insert into evaluacion values(1,3,15,1)
    insert into evaluacion values(1,3,16,2)
    insert into evaluacion values(1,3,16,3)
    
    insert into evaluacion values(2,1,15,1)
    insert into evaluacion values(2,1,16,2)
    insert into evaluacion values(2,1,16,3)
    insert into evaluacion values(2,2,15,1)
    insert into evaluacion values(2,2,16,2)
    insert into evaluacion values(2,2,16,3)
    insert into evaluacion values(2,3,15,1)
    insert into evaluacion values(2,3,16,2)
    insert into evaluacion values(2,3,16,3)

    EL RESULTADO ESPERADO EN LA CONSULTA ES :

    CURSO           /   ESTUDIANTE     /   PRACTICA1 /PRACTICA2/PRACTICA3/PROMEDIO  

    MATEMATICA /guillermotaylor    /     15          /    15          /     15           /     15

    MATEMATICA /    Hunchback    /     16          /    16          /     16           /     16

    MATEMATICA / qwalgrande   /     16          /    16          /     16           /     16

    OTRO RESULTADO ESPERADO :

    CURSO           /   ESTUDIANTE     /   PRACTICA1 /PRACTICA2/PRACTICA3/PROMEDIO  

    MATEMATICA /guillermotaylor    /     15          /    15          /     15           /     15

    MATEMATICA /    guillermotaylor /     15         /    15          /     15           /     16

    MATEMATICA / guillermotaylor  /     15          /    15          /     15          /     16

    OTRO RESULTADO

     ESTUDIANTE     /   PROMEDIOMATEMATICA /PROMEDIOLENGUAJE/PROMEDIOFINAL  

    guillermotaylor    /     15                            /    15                        /     15           

    -----------

    mi problema radica en agrupar criterios ordenados de esa manera en las consultas

    espero sus respuesta gracias saludos



    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Saturday, January 19, 2013 7:37 PM

Answers

  • listo.!! gracias a ti me he vuelto experto en PIVOT(bueno exagere un poco)

    le hize unas modificaciones al script, prueba este

    DECLARE @columns nvarchar(MAX);
    DECLARE @sql nvarchar(MAX);
    DECLARE @Vid_curso nvarchar(MAX);
    -------------------------------------------
    set @Vid_curso=2 --> Aqui se coloca ingresas el codigo de curso y listo
    
    -- OBTIENE EL LISTADO DE Criterios que existen en un curso especifico y lo almacena en la variable @columns
    SET @columns = STUFF(
    	(
    	SELECT
    	  ',' + REPLACE(DesCriterio,' ','')
    	FROM
    	  (SELECT DISTINCT DesCriterio
    			FROM Criterio C
    				INNER JOIN evaluacion E ON C.idCriterio=E.idCriterio
    			WHERE E.id_Curso=@Vid_curso
    	) AS T
    	FOR XML PATH('')
    	), 1, 1, '');
    
    ----
    set @sql=N'
    SELECT
     *
    FROM
     (
    	SELECT
    	EV.ID_CURSO,
    	CU.DES_CURSO,
    	ES.NOMBESTUDIANTE,
    	CR.DesCriterio,
    	EV.nota,
    	PR.PROMEDIO
    	FROM Estudiante ES
    		LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    		LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    		LEFT OUTER JOIN Criterio CR ON EV.idCriterio=CR.idCriterio
    		LEFT OUTER JOIN (
    			SELECT
    			id_Curso,
    			IdEstudiante, 
    			AVG(NOTA) PROMEDIO
    			FROM evaluacion
    			GROUP BY id_Curso,IdEstudiante
    		)PR ON ES.IDESTUDIANTE=PR.IDESTUDIANTE AND CU.ID_CURSO=PR.ID_CURSO
     ) AS T
    PIVOT
     (
     MAX(nota)
     FOR DesCriterio IN (' + @columns +  N')
     ) AS P
    WHERE ID_CURSO='+@Vid_curso
    
    exec(@sql)
    

    Me comentas si te funciono.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    • Marked as answer by PREGUNTÓN 8 Wednesday, February 06, 2013 4:35 PM
    Monday, January 21, 2013 8:57 PM
  • Hola,

    Esta es la parte del codigo donde debes agregar el comando para ordenar los registros.

    Lo que esta en negrita es lo que debes agregar

    '
    MAX(nota)
     FOR DesCriterio IN (' + @columns +  N')
     ) AS P
    WHERE ID_CURSO='+@Vid_curso +'
    ORDER BY ApeNomb ASC '

    Revise el codigo y el campo ApeNomb no esta detro del codigo que te envie, pero imagino que es NOMBEETUDIANTE.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    • Marked as answer by PREGUNTÓN 8 Wednesday, February 06, 2013 4:35 PM
    Friday, January 25, 2013 8:41 PM
  • Excelente, en cuanto al redondeo del promedio, existen varias formas de hacerlo

    FLOOR(124.44455) -- Devolvera 124
    CEILING (124.44455) -- Devolvera 125

    Aqui esta el fragmento de codigo donde debes incluir la funcion para el redondeo, la parte en negrita es la que debes cambiar.

    ----
    set @sql=N'
    SELECT
     *
    FROM
     (
    	SELECT
    	
    	ES.NOMBESTUDIANTE,
    	CU.Des_Curso,
    	PR.PROMEDIO --Aqui colocas cualquiera de estas funciones FLOOR(PR.PROMEDIO) PROMEDIO  Ó CEILING(PR.PROMEDIO) PROMEDIO
    	FROM Estudiante ES
    		LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    		LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    		LEFT OUTER JOIN (
    			SELECT

    Comentas como te fue.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.


    • Edited by Danny_Macario Saturday, February 02, 2013 6:54 PM
    • Marked as answer by PREGUNTÓN 8 Wednesday, February 06, 2013 4:35 PM
    Saturday, February 02, 2013 6:51 PM

All replies

  • Hola,

    Puedes probar con este script

    SELECT
    CU.DES_CURSO,
    ES.NOMBESTUDIANTE,
    EV.PRACTICA_1,
    EV.PRACTICA_2,
    EV.PRACTICA_3,
    CASE WHEN (EV.PRACTICA_1>0 AND EV.PRACTICA_2>0 AND EV.PRACTICA_3>0) THEN (EV.PRACTICA_1+EV.PRACTICA_2+EV.PRACTICA_3) / 3 
    	WHEN (EV.PRACTICA_1>0 AND EV.PRACTICA_2>0 AND EV.PRACTICA_3=0) THEN (EV.PRACTICA_1+EV.PRACTICA_2) / 2
    	WHEN (EV.PRACTICA_1>0 AND EV.PRACTICA_2=0 AND EV.PRACTICA_3=0) THEN EV.PRACTICA_1
    	ELSE 0
    END PROMEDIO
    FROM Estudiante ES
    	LEFT OUTER JOIN(
    		SELECT
    		ID_CURSO,
    		IDESTUDIANTE,
    		SUM(PRACTICA_1) PRACTICA_1,
    		SUM(PRACTICA_2) PRACTICA_2,
    		SUM(PRACTICA_3) PRACTICA_3		
    		FROM(
    			SELECT
    			ID_CURSO,
    			IDESTUDIANTE,
    			CASE WHEN IDCRITERIO=1 THEN NOTA ELSE 0 END PRACTICA_1,
    			CASE WHEN IDCRITERIO=2 THEN NOTA ELSE 0 END PRACTICA_2,
    			CASE WHEN IDCRITERIO=3 THEN NOTA ELSE 0	END PRACTICA_3				
    			FROM evaluacion EV
    		)X 
    		GROUP BY ID_CURSO,IDESTUDIANTE
    	)EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE	
    	LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO

    Este te funciona siempre y cuando el maximo de 'practica' sea 3.

    me comentas si te funciono.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Saturday, January 19, 2013 9:29 PM
  • HOLA DANNY

    pues esta muy bueno tu script pero el problema persiste, pues los criterios de evaluacion son cambiantes

    no tan solo puede haber practica1, practica2,practica3 si no puede haber asignaciones,orales

    puede ser que una asignatura solo tenga 2 criterios, (practica y examen final), puede ser que otra asignatura tenga otros 2 criterios diferentes(asignacion y oral), o puede ser que una asignatura solo tenga un criterio(exanen final), el caso es que es muy cambiante lo de los criterios de evaluacion, y la sentencia tiene que ser flexible a ese cambio, osea la sentencia debe ser capaz de contar los criterios que tiene la asignatura y sacar su promedio..... puede ser 1 o 10 o 20 criterios... ect... saludos


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Monday, January 21, 2013 2:25 PM
  • El resultado de esa consulta lo mostraras en una aplicacion o en algun reporte(Reporting Services, cristal reports etc.)

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Monday, January 21, 2013 2:45 PM
  • no es para un reporte, porque la pregunta?

    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Monday, January 21, 2013 2:52 PM
  • eso se puede hacer usando reporting services, pero dame unos minutos busco la forma de hacerlo vio script.


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Monday, January 21, 2013 2:59 PM
  • Hola,

    Ya logre generar el reporte sigue estos pasos

    Script

    SELECT
    CU.DES_CURSO,
    ES.NOMBESTUDIANTE,
    CR.DesCriterio,
    EV.nota
    FROM Estudiante ES
    	LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE	
    	LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    	LEFT OUTER JOIN Criterio CR ON EV.idCriterio=CR.idCriterio

    Este reporte lo cree con Visual Studio 2005


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Monday, January 21, 2013 4:36 PM
  • me comentas como te fue.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Monday, January 21, 2013 4:37 PM
  • Danny gracias por tu ayuda, pero creo me entendiste mal, o bueno yo no me deje entender te pido disculpa,, yo dije no es para un reporte, porque la pregunta?

    osea no lo quiero para un reporte, lo utilizare para mi aplicacion,

    esa ultima consulta se acerca bastante o lo que quiero

    consulta que genero tu codigo

    pero requiero que los criterios se muestren de esta forma, claro los criterios pueden ser cualquiera(practica1,practica2,practica3) solo lo pongo como referencia, como te dije antes puede haber solo un criterio o muchos criterios de diferentes nombres....

    CURSO           /   ESTUDIANTE     /   PRACTICA1 /PRACTICA2/PRACTICA3/PROMEDIO  

    MATEMATICA /guillermotaylor    /     15          /    15          /     15           /     15

    MATEMATICA /    Hunchback    /     16          /    16          /     16           /     16

    MATEMATICA / qwalgrande   /     16          /    16          /     16           /     16

    Saludos


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Monday, January 21, 2013 5:01 PM
  • Hola,

    ya logre construir lo que solicitas, para ello tuve que aprender sobre la funcion PIVOT, he aqui el codigo

    SELECT
    	CU.DES_CURSO,
    	ES.NOMBESTUDIANTE,
    	CR.DesCriterio,
    	EV.nota,
    	PR.PROMEDIO
    INTO
     #T
    FROM Estudiante ES
    		LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    		LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    		LEFT OUTER JOIN Criterio CR ON EV.idCriterio=CR.idCriterio
    		LEFT OUTER JOIN (
    			SELECT
    			id_Curso,
    			IdEstudiante, 
    			AVG(NOTA) PROMEDIO
    			FROM evaluacion
    			GROUP BY id_Curso,IdEstudiante
    		)PR ON ES.IDESTUDIANTE=PR.IDESTUDIANTE AND CU.ID_CURSO=PR.ID_CURSO
    
    DECLARE @columns nvarchar(MAX);
    DECLARE @sql nvarchar(MAX);
    
    SET @columns = STUFF(
    (
    SELECT
      ',' + REPLACE(DesCriterio,' ','')
    FROM
      (SELECT DISTINCT DesCriterio FROM #T) AS T
    
    FOR XML PATH('')
    ), 1, 1, '');
    
    SET @sql = N'
    SELECT
     *
    FROM
     (
     SELECT
    	DES_CURSO,
    	NOMBESTUDIANTE,
    	DesCriterio,
    	nota,
    	PROMEDIO
     FROM
      #T
     ) AS T
     PIVOT
     (
     MAX(nota)
     FOR DesCriterio IN (' + @columns +  ')
     ) AS P;';
    
    BEGIN TRY
     EXEC sp_executesql @sql;
    END TRY
    BEGIN CATCH
     SELECT 
      ERROR_NUMBER() AS ErrorNumber,
      ERROR_SEVERITY() AS ErrorSeverity,
      ERROR_STATE() as ErrorState,
      ERROR_LINE () as ErrorLine,
      ERROR_PROCEDURE() as ErrorProcedure,
      ERROR_MESSAGE() as ErrorMessage;
    END CATCH;
    GO
    DROP TABLE #T

    Solo hay un inconveniente cuando en la descripcion del criterio hay un espacio(Examen 1) genera un error, no pude determinar la causa, por lo que te recomiendo lo siguiente (Examen_1) o (Examen1).

    Tome como referencia una consulta de este foro: http://social.msdn.microsoft.com/Forums/es/sqlserveres/thread/3df807d4-f6d5-486c-8006-c8021f226249

    Si deseas conocer la funcion PIVOT

    http://msdn.microsoft.com/es-es/library/ms177410(v=sql.105).aspx

    me comentas como te fue.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Monday, January 21, 2013 6:50 PM
  • Gracias realmente muchas gracias.. la verdad no se mucho pivot y ahora tendré que estudiarlo,

    solo una cosita mas haber si me ayudas a completar , estoy tratando de filtrar  where id_Curso =2

    viendo tu script lo he filtrado en  tanto en la parte del 

    LEFT OUTER JOIN (
    			SELECT
    			id_Curso,
    			IdEstudiante, 
    			AVG(NOTA) PROMEDIO
    			FROM evaluacion
    			where id_Curso =2

    y e la parte del 

    SET @sql = N'
    SELECT
     *
    FROM
     (
     SELECT
    	DES_CURSO,
    	NOMBESTUDIANTE,
    	DesCriterio,
    	nota,
    	PROMEDIO
     FROM
      #T
      where id_Curso =2

    y si filtra , me muestra las notas y el promedio, pero tambien me muestra los otros criterios

    supongamos que matematica tiene : practica1,practica2,practica3

    y lenguaje tiene :practica1,practica2

    los resultados salen muy bien pero, si yo filtro lenguaje el resultado me muestra el campo practica3 en null, claro que no afecta al promedio,

    pero como puedo hacer para que ya no se muestre este campo3, osea si tengo mas de 10 criterios en otras asignaturas la consulta me trairia todos esos campos en null...

    con el script que te mande elime el criterio practica3 para el curso id_curso=2

    delete  from evaluacion where id_curso=2 and idCriterio=3

    y cuando realizo la consulta filtrando el id_curso2 este es el resultado

    esa practica3 ya no deberia de salir pues, no es un criterio para el curso 2


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"


    • Edited by PREGUNTÓN 8 Monday, January 21, 2013 7:42 PM falto codigo
    Monday, January 21, 2013 7:40 PM
  • listo.!! gracias a ti me he vuelto experto en PIVOT(bueno exagere un poco)

    le hize unas modificaciones al script, prueba este

    DECLARE @columns nvarchar(MAX);
    DECLARE @sql nvarchar(MAX);
    DECLARE @Vid_curso nvarchar(MAX);
    -------------------------------------------
    set @Vid_curso=2 --> Aqui se coloca ingresas el codigo de curso y listo
    
    -- OBTIENE EL LISTADO DE Criterios que existen en un curso especifico y lo almacena en la variable @columns
    SET @columns = STUFF(
    	(
    	SELECT
    	  ',' + REPLACE(DesCriterio,' ','')
    	FROM
    	  (SELECT DISTINCT DesCriterio
    			FROM Criterio C
    				INNER JOIN evaluacion E ON C.idCriterio=E.idCriterio
    			WHERE E.id_Curso=@Vid_curso
    	) AS T
    	FOR XML PATH('')
    	), 1, 1, '');
    
    ----
    set @sql=N'
    SELECT
     *
    FROM
     (
    	SELECT
    	EV.ID_CURSO,
    	CU.DES_CURSO,
    	ES.NOMBESTUDIANTE,
    	CR.DesCriterio,
    	EV.nota,
    	PR.PROMEDIO
    	FROM Estudiante ES
    		LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    		LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    		LEFT OUTER JOIN Criterio CR ON EV.idCriterio=CR.idCriterio
    		LEFT OUTER JOIN (
    			SELECT
    			id_Curso,
    			IdEstudiante, 
    			AVG(NOTA) PROMEDIO
    			FROM evaluacion
    			GROUP BY id_Curso,IdEstudiante
    		)PR ON ES.IDESTUDIANTE=PR.IDESTUDIANTE AND CU.ID_CURSO=PR.ID_CURSO
     ) AS T
    PIVOT
     (
     MAX(nota)
     FOR DesCriterio IN (' + @columns +  N')
     ) AS P
    WHERE ID_CURSO='+@Vid_curso
    
    exec(@sql)
    

    Me comentas si te funciono.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    • Marked as answer by PREGUNTÓN 8 Wednesday, February 06, 2013 4:35 PM
    Monday, January 21, 2013 8:57 PM
  • excelente la verdad: disculpa la demora has respondido la pregunta pero disculpa que te moleste mas pero, ¿te puedo hacer una pregunta mas

    mira: aveces se dan que una asignatura pueda tener varios periodos o unidades didactica y cada unidad tiene un promedio al final se suman y dividen y resulta un promedio final, si yo agrego a la tabla evaluacion un columna

    ALTER TABLE  evaluacion ADD UnidadDidactica int

    y supongamos solo suponiendo aya dos unidades didacticas 1 y 2 pueden haber mas,   entonces tendria para el curso1 de matematica 2 unidades didacticas

    algo asi

    y pues  el resultado esperado cuando se consulte seria asi para el curso de matematica

    bueno aunque la imagen me dice que la unidad 1 tiene dos criterios para tener un promedio

    y la unidad 2 solo un criterio para obtener otro promedio 

    y de esos dos promedios sale el promedio final

    claro que alli faltaria un criterio para examen sustitutorio si es que el alumno saldria desaprobado(alguna recomendacion?? o lo manejaria en otra tabla mmm?), bueno solo mi pregunta es para el resultado esperado de la imagen, aunque ya respondistes el hilo pero haber si resuelves esta pregunta agregada, si tu respuesta en que ya no quieres resolverla pues.. igual marcare la respuesta muchas gracias por tu ayuda... 


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"


    • Edited by PREGUNTÓN 8 Tuesday, January 22, 2013 12:38 AM falta explicar
    Tuesday, January 22, 2013 12:36 AM
  • No es ninguna molestia.

    Ya lo reviso.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.


    Tuesday, January 22, 2013 12:54 AM
  • Hola,

    este es el script que genera los datos, solo hay un problema, no logre obtener el PROMEDIO FINAL, imagino que se esta informacion lo mostraras en datagridview, creo que desde alli se podria obtener ese resultado.

    DECLARE @columns nvarchar(MAX);
    DECLARE @sql nvarchar(MAX);
    DECLARE @Vid_curso nvarchar(MAX);
    -------------------------------------------
    set @Vid_curso=1 --> Aqui se coloca ingresas el codigo de curso y listo
    
    -- OBTIENE EL LISTADO DE Criterios que existen en un curso especifico y lo almacena en la variable @columns
    SET @columns = STUFF(
    	(
    	SELECT
    	  ',' + REPLACE(DesCriterio,' ','')
    	FROM
    	  (SELECT DISTINCT DesCriterio
    			FROM Criterio C
    				INNER JOIN evaluacion E ON C.idCriterio=E.idCriterio
    			WHERE E.id_Curso=@Vid_curso
    	) AS T
    	FOR XML PATH('')
    	), 1, 1, '');
    
    
    -------------------------------------------
    -- OBTIENE EL LISTADO DE UnidadDidactica
    
    DECLARE @Vcolumns nvarchar(MAX);
    DECLARE @Vsql nvarchar(MAX);
    
    SET @Vcolumns = STUFF(
    	(
    	SELECT
    	  ','+ QUOTENAME(cast(UnidadDidactica as nvarchar(max)))
    	FROM
    	  (SELECT DISTINCT UnidadDidactica
    			FROM Criterio C
    				INNER JOIN evaluacion E ON C.idCriterio=E.idCriterio
    			WHERE E.id_Curso=@Vid_curso
    	) AS T
    	FOR XML PATH('')
    	), 1, 1, '');
    
    --
    set @sql=N'
    SELECT
    *
    FROM dbo.Estudiante EST
    	LEFT OUTER JOIN(	
    		SELECT
    		 *
    		FROM
    		 (
    			SELECT
    			EV.ID_CURSO,
    			CU.DES_CURSO,
    			EV.IDESTUDIANTE,			
    			CR.DesCriterio,
    			EV.nota			
    			FROM Estudiante ES
    				LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    				LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    				LEFT OUTER JOIN Criterio CR ON EV.idCriterio=CR.idCriterio
    				LEFT OUTER JOIN (
    					SELECT
    					id_Curso,
    					IdEstudiante, 					
    					AVG(NOTA) PROMEDIO
    					FROM evaluacion
    					GROUP BY id_Curso,IdEstudiante --,UnidadDidactica 
    				)PR ON ES.IDESTUDIANTE=PR.IDESTUDIANTE AND CU.ID_CURSO=PR.ID_CURSO
    		 ) AS T
    		PIVOT
    		 (
    		 MAX(nota)
    		 FOR DesCriterio IN (' + @columns +  N')
    		 ) AS P
    		WHERE ID_CURSO='+@Vid_curso +'
    	)T1 ON EST.IDESTUDIANTE=T1.IDESTUDIANTE
    	--- OBTIENE LOS PROMEDIOS POR UnidadDidactica
    	LEFT OUTER JOIN(
    		SELECT
    		*
    		FROM(
    			SELECT
    			id_Curso,
    			IdEstudiante, 
    			cast(UnidadDidactica as nvarchar(max)) UnidadDidactica,			
    			AVG(NOTA) PROMEDIO
    			FROM evaluacion
    			GROUP BY id_Curso,IdEstudiante,UnidadDidactica 
    		)AS P
    		PIVOT(
    		MAX(PROMEDIO)
    			FOR UnidadDidactica IN ('+ @Vcolumns + N') 
    		)AS PIV
    		WHERE id_Curso='+@Vid_curso +'
    	)T2 ON T1.IDESTUDIANTE=T2.IDESTUDIANTE AND T1.ID_CURSO=T2.ID_CURSO'
    exec(@sql)
    

    Me comentas si funciona.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Tuesday, January 22, 2013 7:17 PM
  • Hola:

    pues disculpa la demora en responder, sabes estaba adaptando el procedimiento a mi bd original y todo me sale bien, pero no puedo hacer el ORDER BY ES.ApeNomb ASC quiero poder ordenarlos, y la verdad estoy tratando de entender mas tu sentencia....

    la respuesta que estoy empleando en del lunes, 21 de enero de 2013 20:57


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Friday, January 25, 2013 7:16 PM
  • Hola,

    Esta es la parte del codigo donde debes agregar el comando para ordenar los registros.

    Lo que esta en negrita es lo que debes agregar

    '
    MAX(nota)
     FOR DesCriterio IN (' + @columns +  N')
     ) AS P
    WHERE ID_CURSO='+@Vid_curso +'
    ORDER BY ApeNomb ASC '

    Revise el codigo y el campo ApeNomb no esta detro del codigo que te envie, pero imagino que es NOMBEETUDIANTE.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    • Marked as answer by PREGUNTÓN 8 Wednesday, February 06, 2013 4:35 PM
    Friday, January 25, 2013 8:41 PM
  • Y siguiendo con la misma pregunta, si quisiera hacer un resumen:

    algo asi : DONDE PROMEDIO FINAL SERIA LA SUMATORIA DE LOS PROMEDIOS DE LAS ASIGNATURAS ENTRE LA CANTIDAD DE ASIGNATURAS 

     IDESTUDIANTE /PROMEDIO FINAL MATEMATICA /PROMEDIO FINAL LENGUAJE / PROMEDIO FINAL

    1                                    15                                                                15                       16

    2                                   16                                                                16                      16

    3                                   16                                                                  16                      16

    ------------------------------------------------------------------------------------------------------------------------------------------


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Saturday, January 26, 2013 7:05 PM
  • Hola estimado(a),

    Yo con gusto podria generar el codigo para que devuleva el resumen que pides, pero yo te quiero hacer una sugerencia, trata de crear esa consulta tomando como base el codigo que he publicado, esto con el fin de enriquezer tus conocimientos.

    Si logras construir tu codigo y los resultados no son los esperados o te da algun error, publicalo yo estare al pendiente de tu evolucion.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.

    Sunday, January 27, 2013 9:33 AM
  • Pues en esas estoy:

    Solo que paralelo a esta pregunta estoy haciendo casi lo mismo, pero con criterios mas standar por motivos de tiempo de entrega, pero este planteamiento

    si que da para mas... pues es mas flexible, y ala vez investigando que control (gridview,table, pues tendrían que ser muy dinámicos)o de que forma, se acomodara mejor para el usuario,con lo otro en estos días culmino lo que estoy haciendo en paralelo para dedicarme de lleno a resolver esta consulta, pues gracias a ti mejorare lo realizado anteriormente.  

    Ya te estaré enviando el código que estoy construyendo, muchas gracias mi amigo, solo espero que el moderador no cierre la pregunta.... Saludos....


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Sunday, January 27, 2013 2:17 PM
  • Hola.

    ¿Resolviste el problema?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    Saturday, February 02, 2013 10:43 AM
  • Sr. Qwalgrande, hoy mismo me dedicare a tratar de resolver la consulta, espero no de por cerrado la pregunta...

    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Saturday, February 02, 2013 1:15 PM
  • Hola Danny pues me quedo algo asi: 

    ECLARE @columns nvarchar(MAX);
    DECLARE @sql nvarchar(MAX);
    DECLARE @Vid_curso nvarchar(MAX);
    -------------------------------------------
    --> Aqui se coloca ingresas el codigo de curso y listo
    
    -- OBTIENE EL LISTADO DE Cursos que existen en un curso especifico y lo almacena en la variable @columns
    SET @columns = STUFF(
    	(
    	SELECT
    	  ',' + REPLACE(Des_curso,' ','')
    	FROM
    	  (SELECT DISTINCT Des_curso
    			FROM curso  C
    				INNER JOIN evaluacion E ON C.id_curso =E.id_Curso 
    	) AS T
    	FOR XML PATH('')
    	), 1, 1, '');
    
    ----
    set @sql=N'
    SELECT
     *
    FROM
     (
    	SELECT
    	
    	ES.NOMBESTUDIANTE,
    	CU.Des_Curso,
    	PR.PROMEDIO
    	FROM Estudiante ES
    		LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    		LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    		LEFT OUTER JOIN (
    			SELECT
    			id_Curso,
    			IdEstudiante, 
    			AVG(NOTA) PROMEDIO
    			FROM evaluacion
    			GROUP BY id_Curso,IdEstudiante
    		)PR ON ES.IDESTUDIANTE=PR.IDESTUDIANTE AND CU.ID_CURSO=PR.ID_CURSO
     ) AS T
    PIVOT
     (
     MAX(PROMEDIO)
     FOR Des_Curso IN (' + @columns +  N')
     ) AS P'
    exec(@sql)

    el resultado sale.. pero quisiera pudieras darle una mirada haber que te parece...

    tengo un problema pues quiero redondear el promedio pero me sale sintaxis incorrecta

    MAX(cast(ROUND(PROMEDIO, 0) AS INT) )  me podrias guiar? SALUDOS

     

    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"

    Saturday, February 02, 2013 5:56 PM
  • Excelente, en cuanto al redondeo del promedio, existen varias formas de hacerlo

    FLOOR(124.44455) -- Devolvera 124
    CEILING (124.44455) -- Devolvera 125

    Aqui esta el fragmento de codigo donde debes incluir la funcion para el redondeo, la parte en negrita es la que debes cambiar.

    ----
    set @sql=N'
    SELECT
     *
    FROM
     (
    	SELECT
    	
    	ES.NOMBESTUDIANTE,
    	CU.Des_Curso,
    	PR.PROMEDIO --Aqui colocas cualquiera de estas funciones FLOOR(PR.PROMEDIO) PROMEDIO  Ó CEILING(PR.PROMEDIO) PROMEDIO
    	FROM Estudiante ES
    		LEFT OUTER JOIN evaluacion EV ON ES.IDESTUDIANTE=EV.IDESTUDIANTE			
    		LEFT OUTER JOIN curso CU ON EV.ID_CURSO=CU.ID_CURSO
    		LEFT OUTER JOIN (
    			SELECT

    Comentas como te fue.

    Saludos,


    Danny Macario - Desarrollador de Software - Honduras, C.A.


    • Edited by Danny_Macario Saturday, February 02, 2013 6:54 PM
    • Marked as answer by PREGUNTÓN 8 Wednesday, February 06, 2013 4:35 PM
    Saturday, February 02, 2013 6:51 PM
  • uyy.. disculpa la demora.. en responder muchas gracias por todo Danny

    espero en el futuro hacerte mas consultas.. por ahora.. marco la respuesta..... nuevamente.. muchas gracias...


    "SI LOGRAS CONCENTRARTE EL MUNDO DEJARA DE EXISTIR"


    • Edited by PREGUNTÓN 8 Wednesday, February 06, 2013 4:34 PM
    Wednesday, February 06, 2013 4:34 PM