SQL - Problema filtrando por el nombre

 
Vista:
Imágen de perfil de Jhon Jairo
Val: 30
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Problema filtrando por el nombre

Publicado por Jhon Jairo (22 intervenciones) el 11/03/2017 16:53:48
HOla, uso sql 2012, este procedimiento almacenado me saca un mensaje de erro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
USE [Academico]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE PROCEDURE [dbo].[9_PROMEDIO_ALUMNOS_INDICANDO_ASIGNATURA]
@ASIGNATURA NVARCHAR(50),
AS
 
SELECT AVG(*) FROM(
 select a.DocIdent, a.apellidos, a.nombres ,s.nombre, n.Definitiva
 from dbo.Alumno a inner join dbo.Nota n
 on a.DocIdent = n.DocIdent inner join dbo.Asignatura s
 on s.CodAsig = n.codAsig
 where s.Nombre = @ASIGNATURA
)

Mens 156, Nivel 15, Estado 1, Procedimiento 9_PROMEDIO_ALUMNOS_INDICANDO_ASIGNATURA, Línea 4
Sintaxis incorrecta cerca de la palabra clave 'AS'.
Mens 102, Nivel 15, Estado 1, Procedimiento 9_PROMEDIO_ALUMNOS_INDICANDO_ASIGNATURA, Línea 6
Sintaxis incorrecta cerca de '*'.

Y lo que trato de hacer es:
9. Retornar e imprimir el promedio de los alumnos de cualquier asignatura, indicando el nombre de la asignatura.

Si pueden darme una indicación (con mucho respeto) se los agradecería
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Problema filtrando por el nombre

Publicado por leonardo_josue (1173 intervenciones) el 13/03/2017 16:53:50
Hola Jhon Jairo:

El problema que tienes es que la función de agrupación AVG NO PUEDE APLICARSE CON EL OPERADOR *, sino que tiene que ser aplicada sobre un campo de tipo NUMÉRICO.

Creo que tienes que darle una repasada a cualquier manual de SQL para que veas cómo trabaja la función promedio y sobre todo como trabajan las funciones de agrupación, la cláusula GROUP BY y la cláusula HAVING.

Checa este ejemplo. Supongamos que tienes estos datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla;
+--------+--------------+
| alumno | calificacion |
+--------+--------------+
| hugo   |            9 |
| hugo   |            6 |
| hugo   |           10 |
| paco   |            5 |
| paco   |            4 |
| paco   |            5 |
| luis   |           10 |
| luis   |            9 |
| luis   |           10 |
+--------+--------------+
9 rows in set (0.00 sec)

Si quieres obtener el promedio de cada alumno, la función AVG la aplicas al campo CALIFICACION y AGRUPAS por el campo alumno:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT alumno, AVG(calificacion)
    -> FROM tabla
    -> GROUP BY alumno;
+--------+-------------------+
| alumno | AVG(calificacion) |
+--------+-------------------+
| hugo   |            8.3333 |
| luis   |            9.6667 |
| paco   |            4.6667 |
+--------+-------------------+
3 rows in set (0.00 sec)

Si quieres el promedio general de todos los alumnos, aplicas la función AVG SIN AGRUPAR:

1
2
3
4
5
6
7
8
mysql> SELECT AVG(calificacion)
    -> FROM tabla;
+-------------------+
| AVG(calificacion) |
+-------------------+
|            7.5556 |
+-------------------+
1 row in set (0.00 sec)

Pero en ningún caso puedes hacer un AVG (*)

1
2
3
4
5
mysql> SELECT AVG(*)
    -> FROM tabla;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '*)
FROM tabla' at line 1

Lee un poco de documentación y nos comentas si sigues con problemas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon Jairo
Val: 30
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Problema filtrando por el nombre

Publicado por Jhon Jairo (22 intervenciones) el 13/03/2017 20:34:51
Muchas gracias Leonardo, voy a hacer lo que me dijiste. Bajaré un manual de sql y luego revisaré el sp.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar