Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con Join en Procedimiento

Estas en el tema de Problema con Join en Procedimiento en el foro de SQL Server en Foros del Web. Hola, espero que me ayuden.. mi problema es el siguiente: Tengo que hacer un procedimiento que devuelva NombreCurso,NombreExamen,Fecha,AlumnosEnCurso,Rind ieronExamen,Aprobaron,Reprobaron,FaltanRendir Mi código es el siguiente: @import ...
  #1 (permalink)  
Antiguo 07/11/2013, 16:18
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta Problema con Join en Procedimiento

Hola, espero que me ayuden.. mi problema es el siguiente:
Tengo que hacer un procedimiento que devuelva NombreCurso,NombreExamen,Fecha,AlumnosEnCurso,Rind ieronExamen,Aprobaron,Reprobaron,FaltanRendir

Mi código es el siguiente:
Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[listarExamenesProfesor]
  2. @Id_Profesor INT
  3. AS
  4. SELECT cu.Nombre AS CURSOS,ex.Nombre AS EXAMEN,ex.FecHora AS FECHA_Y_HORA,
  5. COUNT(r.AlumnoId) AS RINDIERON,
  6. (SELECT COUNT(r2.AlumnoId) FROM RESULTADO r2 WHERE r2.Nota >= 7)AS APROBARON,
  7. (SELECT COUNT(r2.AlumnoId) FROM RESULTADO r2 WHERE r2.Nota < 7) AS REPROBARON
  8. FROM CURSO cu LEFT JOIN EXAMEN ex ON cu.IdCurso=ex.CursoId LEFT JOIN RESULTADO r ON ex.IdExamen=r.ExamenId
  9. LEFT JOIN Curso_Alumno cal ON cu.IdCurso=cal.IDCURSO
  10. WHERE cu.ProfId=@Id_Profesor
  11. GROUP BY cu.IdCurso,cu.Nombre,cu.Estado,cu.FecIni,cu.FecFin,cu.ProfId,
  12. ex.IdExamen,ex.Nombre,ex.Descripcion,ex.FecHora,ex.Duracion,ex.CursoId
  13.  
  14. GO
El error es que me devuelve el mismo valor en las columnas Aprobaron,Reprobaron cuando en realidad tendría que devolver (por ejemplo: Resultado.Nota =7 y Resultado.Nota =4) Rindieron | Aprobaron | Reprobaron
2 | 1 | 1

Última edición por gnzsoloyo; 07/11/2013 a las 17:15
  #2 (permalink)  
Antiguo 07/11/2013, 16:28
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Problema con Join en Procedimiento

¿Ya ejecutaste estos query's solos?

Código SQL:
Ver original
  1. SELECT COUNT(r2.AlumnoId) FROM RESULTADO r2 WHERE r2.Nota >= 7
  2.  
  3. SELECT COUNT(r2.AlumnoId) FROM RESULTADO r2 WHERE r2.Nota < 7

¿Qué te da?
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 08/11/2013, 07:34
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Exclamación Respuesta: Problema con Join en Procedimiento

Si..lo probe y me devuelve el valor contando todo los registros de mi tabla Resultado,
por ejemplo
tabResultado=>
IDExamen Nota
1 5
1 9
1 6
2 2
3 7
3 4

Esa consulta me muestra: Aprobados> 2 Desaprobados>4
Es decir que cuenta teniendo en cuenta toda la tabla y no distinguiendo por cada IdExamen como quiero que suceda
IDExamen>1 Aprobados>1 Desaprobados>2
IDExamen>2 Aprobados>0 Desaprobados>2
IDExamen>3 Aprobados>1 Desaprobados>1
  #4 (permalink)  
Antiguo 08/11/2013, 07:38
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Problema con Join en Procedimiento

<saludos>
Dices que te interesa que tenga en cuenta el examen, pero el examen como tal no está en la subconsulta, intentaste ya agregando el examen dentro de las subconsultas en el sp?
</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #5 (permalink)  
Antiguo 08/11/2013, 07:42
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con Join en Procedimiento

No lo probe, lo incluyo dentro del where de las subconsultas??
Código SQL:
Ver original
  1. SELECT COUNT(r2.AlumnoId)
  2. FROM RESULTADO r2  INNER JOIN Examen ex ON r2.Examen = ex.ExamenID
  3. WHERE r2.Nota >= 7

Última edición por gnzsoloyo; 08/11/2013 a las 08:35
  #6 (permalink)  
Antiguo 08/11/2013, 07:51
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con Join en Procedimiento

Inclui lo el join con examen como lo indique en el anterior post pero me sigue devolviendo lo mismo supongo que es en el select donde debo agregar algo.. Bah supongo.. ahi es donde ya no se me ocurre como hacer..
  #7 (permalink)  
Antiguo 08/11/2013, 07:52
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Problema con Join en Procedimiento

<saludos>
En efecto, aunque la verdad estoy divagando pues hago suposiciones
sin data ni tablas para probar!! jajaja, así que, no me juzgues!!!
</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #8 (permalink)  
Antiguo 08/11/2013, 09:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Join en Procedimiento

pregunta, porque no haces esto:

Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[listarExamenesProfesor]
  2. @Id_Profesor INT
  3. AS
  4. SELECT cu.Nombre AS CURSOS,ex.Nombre AS EXAMEN,ex.FecHora AS FECHA_Y_HORA,
  5. COUNT(r.AlumnoId) AS RINDIERON,
  6. CASE WHEN nota>=7 THEN COUNT(1) END AS aprobaron,
  7. CASE WHEN nota< 7 THEN COUNT(1) END AS reprobaron
  8. FROM CURSO cu LEFT JOIN EXAMEN ex ON cu.IdCurso=ex.CursoId LEFT JOIN RESULTADO r ON ex.IdExamen=r.ExamenId
  9. LEFT JOIN Curso_Alumno cal ON cu.IdCurso=cal.IDCURSO
  10. WHERE cu.ProfId=@Id_Profesor
  11. GROUP BY cu.IdCurso,cu.Nombre,cu.Estado,cu.FecIni,cu.FecFin,cu.ProfId,
  12. ex.IdExamen,ex.Nombre,ex.Descripcion,ex.FecHora,ex.Duracion,ex.CursoId
  13.  
  14. GO
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 08/11/2013, 09:48
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con Join en Procedimiento

Gracias por la colaboracion y por la ultima sugerencia usuario Libras.
Lo resolvi, como bien me ayudo a analizarlo un amigo, agregando en las subconsultas una asociacion con la consulta madre, es decir
Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[listarExamenesProfesor]
  2. @Id_Profesor INT
  3. AS
  4. SELECT cu.Nombre AS CURSOS,ex.Nombre AS EXAMEN,ex.FecHora AS FECHA_Y_HORA,
  5. COUNT(r.AlumnoId) AS RINDIERON,
  6. (SELECT COUNT(r2.AlumnoId) FROM RESULTADO r2 LEFT JOIN EXAMEN ex2 ON r2.ExamenId=ex2.IdExamen WHERE r2.Nota >= 7 AND r2.ExamenId=r.ExamenId)AS APROBARON,
  7. (SELECT COUNT(r2.AlumnoId) FROM RESULTADO r2 LEFT JOIN EXAMEN ex2 ON r2.ExamenId=ex2.IdExamen WHERE r2.Nota < 7 AND r2.ExamenId=r.ExamenId) AS REPROBARON
  8. (...)
group by cu.Nombre,ex.Nombre,ex.FecHora,ex.CursoId,r.Examen Id

Ahora bien, me faltaria saber como logro obtener los alumnos que faltan rendir examen.. Acepto sugerencias..

Última edición por gnzsoloyo; 08/11/2013 a las 10:34
  #10 (permalink)  
Antiguo 08/11/2013, 09:54
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Join en Procedimiento

si usas lo que te mencione no necesitas poner tus subconsultas :P, ahora si pones un pequeño ejemplo de tus datos y que es lo que quieres obtener con ellos se te podria ayudar mas facilmente :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 08/11/2013, 10:08
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con Join en Procedimiento

Si,esta bien. Igual lo tengo en cuenta gracias.
Tengo:
Tabla CursoAlumno( FK idCurso, FK idAlumno)
Tabla Alumno(PK IdAlumno,Nombre)
Tabla Examen(PK idExamen,Nombre,FK CursoId)
Tabla Resultado(PK idResultado,Nota,FK AlumnoId,FK ExamenId)

Lo que yo hacia para determinar cantidad de Alumnos era agregar COUNT(IdAlumno) de la tabla CursoAlumno pero agregandolo al procedimiento que ya tengo, es decir que tengo hacer un join mas..

No se si sirve esto para que me puedan ayudar o entender.
  #12 (permalink)  
Antiguo 08/11/2013, 10:09
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Join en Procedimiento

datos datos....eso a mi no me sirve, si pones tus datos es mas facil que te pueda ayudar, con un pequeño ejemplo de cada tabla estaria perfecto :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 08/11/2013, 10:23
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con Join en Procedimiento

Ok.
Tabla CursoAlumno
idCurso idAlumno
43 15
43 12
43 5
36 16
36 8

Tabla Examen
id Nombre CursoId
1 Examen1 36
2 Examen2 43
3 Examen3 43
4 Examen4 43

Tabla Resultado
Nota AlumnoId ExamenId
6 15 43
9 5 43

Sirve??
  #14 (permalink)  
Antiguo 08/11/2013, 11:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Join en Procedimiento

A ver si esto es lo que buscas:

Código SQL:
Ver original
  1. CREATE TABLE #cursoalumno
  2. (
  3. idcurso INT,
  4. idalumno INT
  5. )
  6.  
  7. CREATE TABLE #examen
  8. (
  9. id INT,
  10. nombre VARCHAR(20),
  11. cursoid INT
  12. )
  13.  
  14. CREATE TABLE #resultado
  15. (
  16. nota INT,
  17. alumnoid INT,
  18. examenid INT
  19. )
  20.  
  21. DELETE FROM #cursoalumno
  22. DELETE FROM #examen
  23. DELETE FROM #resultado
  24.  
  25. INSERT INTO #cursoalumno VALUES ( 43 ,15)
  26. INSERT INTO #cursoalumno VALUES (43, 12)
  27. INSERT INTO #cursoalumno VALUES (43, 5)
  28. INSERT INTO #cursoalumno VALUES (36, 16)
  29. INSERT INTO #cursoalumno VALUES (36, 8)
  30.  
  31. INSERT INTO #examen VALUES  (1, 'Examen1', 36)
  32. INSERT INTO #examen VALUES  (2,'Examen2', 43)
  33. INSERT INTO #examen VALUES  (3,'Examen3', 43)
  34. INSERT INTO #examen VALUES  (4,'Examen4', 43)
  35.  
  36. INSERT INTO #resultado VALUES ( 6, 15 ,4)
  37. INSERT INTO #resultado VALUES (9, 5 ,4)
  38.  
  39.  
  40. SELECT idcurso,nombre,SUM(aprobados) AS aprobados, SUM(reprobados) AS reprobados, SUM(presentaron) AS presentaron, SUM(faltantes) AS faltantes
  41. FROM(
  42. SELECT  
  43. idcurso,idalumno,nombre,CASE WHEN nota>=7 THEN COUNT(1) END AS aprobados,
  44. CASE WHEN nota<7 THEN COUNT(1) END AS reprobados, COUNT(t3.alumnoid) presentaron,
  45. CASE WHEN isnull(nota,0)=0 THEN COUNT(1) END AS faltantes
  46. FROM #cursoalumno AS t1
  47. LEFT JOIN #examen AS t2 ON (t1.idcurso=t2.cursoid)
  48. LEFT JOIN #resultado AS t3 ON (t3.alumnoid=t1.idalumno AND t2.id=t3.examenid)
  49. GROUP BY idcurso,idalumno,nombre,nota,t3.alumnoid
  50. ) t1 GROUP BY idcurso,nombre

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 08/11/2013, 18:08
 
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Airesa
Mensajes: 14
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con Join en Procedimiento

No funciono

Probe el select de ejemplo como una consulta separada sin incluirla en mi procedimiento y me devuelve en aprobados y reprobados todos valores NULL cuando en mi tabla Resultados tengo Notas y tampoco hace la cuenta de cuantos Alumnos ya rindieron el examen, algo que el COUNT(alumnoId) de mi codigo si lo hace.
  #16 (permalink)  
Antiguo 10/11/2013, 20:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con Join en Procedimiento

lo ejecutaste como te lo mande???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: procedimiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:36.