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

Listado de cursos con número de plazas libres

Estas en el tema de Listado de cursos con número de plazas libres en el foro de SQL Server en Foros del Web. Hola a todos: Tengo dos tablas: cursos y alumnos. Quiero sacar con un procedimiento almacenado la lista de cursos de un determinado mes y año ...
  #1 (permalink)  
Antiguo 13/12/2006, 04:00
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Listado de cursos con número de plazas libres

Hola a todos:

Tengo dos tablas: cursos y alumnos. Quiero sacar con un procedimiento almacenado la lista de cursos de un determinado mes y año en el que aparezcan también las plazas disponibles en cada curso.

Cada registro de curso tiene un campo Plazas con el número total de plazas. Cada registro de alumno tiene un campo IDCurso que identifica el curso en el que está inscrito.

Por tanto, debería añadir a cada registro del resultado de la consulta, un campo Libres que sea el resultado de restar al valor de Plazas el número de alumnos apuntados a ese curso.

De momento tengo esto que, evidentemente, no funciona:

Código:
ALTER PROCEDURE PA_ListaCursos
(
@ano int,
@mes int
)
AS
BEGIN
SELECT 
	*,
	COUNT(a.*) AS Libres 
FROM cursos AS c
RIGHT JOIN alumnos AS a
ON a.IDCurso = c.ID
WHERE
	c.Activo = 1
	AND
	YEAR(c.FechaIni) = @ano
	AND
	MONTH(c.FechaIni) = @mes
	AND
	a.Estado = 'A'
END
Gracias y un saludo
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 13/12/2006, 04:25
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Re: Listado de cursos con número de plazas libres

Antes lo pregunto antes lo resuelvo. En fin, por si le sirve a alguien:

Código:
ALTER PROCEDURE PA_ListaCursos
(
	@ano int,
	@mes int
)
AS
BEGIN
	SELECT 
		c.*,
		c.Plazas - (SELECT COUNT(a.ID) FROM alumnos AS a WHERE a.IDCurso = c.ID AND a.Estado = 'A') AS Libres
	FROM cursos AS c
	WHERE
		c.Activo = 1
		AND
		YEAR(c.FechaIni) = @ano
		AND
		MONTH(c.FechaIni) = @mes
END
Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #3 (permalink)  
Antiguo 13/12/2006, 09:45
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 18 años
Puntos: 8
Re: Listado de cursos con número de plazas libres

Muy interesante tu solución Bravenap.

Saludos.
  #4 (permalink)  
Antiguo 13/12/2006, 20:38
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 18 años
Puntos: 6
Re: Listado de cursos con número de plazas libres

En lo personal yo no metería una subconsulta a una clausula Select, por que la haría medio pesada, podrías intentar esto

Código:
SELECT
        C.*, C.PLAZAS - ISNULL(A.ID, 0) AS LIBRES
FROM
        CURSOS C
LEFT JOIN
        ALUMNOS A
        ON
        C.ID = A.IDCURSO
        AND
        A.ESTADO = 'A'
WHERE
        C.ACTIVO = 1
        AND
        YEAR(C.FECHAINI) = @ANIO
        AND
        MONTH(C.FECHAINI= @MES
Creo que tambien te dará el resultado

Pruebalo y me cuentas

Saludos!

Última edición por Gabo77; 13/12/2006 a las 20:43
  #5 (permalink)  
Antiguo 14/12/2006, 05:47
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Re: Listado de cursos con número de plazas libres

Gracias pero esto no me funciona. Por ejemplo, en diciembre de 2006 tengo un curso de 30 plazas con 2 alumnos apuntados. El ID del alumnos es 1 y 3 respectivamente. Me devuelve dos registros con el mismo curso, sólo que en el primero quedan 29 libres (30 plazas -1) y en el segundo 27 libres (30 plazas - 3). Esto quiere decir que descuenta el ID del alumno y no el número de alumnos, aparte de que debería devolver un sólo registro con 28 plazas libres (30 plazas - 2 alumnos).

Entiendo que es por esto:

C.PLAZAS - ISNULL(A.ID, 0) AS LIBRES

Aunque modificándolo seguiría dando un registro repetido por cada alumno apuntado.

Gracias de todas formas y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #6 (permalink)  
Antiguo 14/12/2006, 10:53
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 18 años
Puntos: 6
Re: Listado de cursos con número de plazas libres

pero que bruto soy! tienes toda la razon!
Código:
SELECT
        C.*, C.PLAZAS - COUNT(A.ID) AS LIBRES
FROM
        CURSOS C
LEFT JOIN
        ALUMNOS A
        ON
        C.ID = A.IDCURSO
        AND
        A.ESTADO = 'A'
WHERE
        C.ACTIVO = 1
        AND
        YEAR(C.FECHAINI) = @ANIO
        AND
        MONTH(C.FECHAINI= @MES
GROUP BY
        C.* /*EL ASTERISCO AQUI NO VA POR QUE MANDARÍA ERROR, PERO NO SE LA ESTRUCTURA DE TU TABLA, TOCARÍA CAMBIARLA*/
Saludos y una disculpa :(!
  #7 (permalink)  
Antiguo 15/12/2006, 01:59
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Re: Listado de cursos con número de plazas libres

Estupendo, muchísimo mejor. Queda por tanto así:

Código:
SELECT 
	c.ID,
	c.Nombre,
	CONVERT(CHAR(10), c.FechaIni,103) AS FechaIni,
	CONVERT(CHAR(10), c.FechaFin,103) AS FechaFin,
	c.Plazas,
	c.Plazas - COUNT(A.ID) AS Libres
FROM cursos c
LEFT JOIN alumnos a ON 
	c.ID = a.IDCurso 
	AND 
	A.Estado = 'A' 
WHERE 
	C.Activo = 1 
	AND 
	YEAR(C.FechaIni) = @ano
	AND 
	MONTH(C.FechaIni) = @mes
GROUP BY 
	C.ID, C.Nombre, c.FechaIni, c.FechaFin, c.Plazas
Muchas gracias.

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #8 (permalink)  
Antiguo 15/12/2006, 22:57
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 18 años
Puntos: 6
Re: Listado de cursos con número de plazas libres

Me alegro que te haya servido! un Saludo!

Alguien sabe como pongo una firma???
  #9 (permalink)  
Antiguo 18/12/2006, 05:05
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Re: Listado de cursos con número de plazas libres

Ve a Panel de Control (enlace en la cabecera) y en el menú de la izquierda tienes la opción de "Editar firma".

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #10 (permalink)  
Antiguo 18/12/2006, 07:52
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 18 años
Puntos: 6
Re: Listado de cursos con número de plazas libres

es que precisamente esa opcion no la veo en el panel de control... :(
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 22:29.