Sacar promedio en select

06/04/2005 - 14:38 por Matías | Informe spam
Hola grupo, tengo el siguiente sp en el cual saco los promedios de las
etapas 1 y 2:

SELECT M.Nombre AS Materia, N.IDEtapa,
CASE WHEN N.IDEtapa = 1 or N.IDEtapa= 2 THEN ROUND(AVG(N.Nota+.0),2) ELSE 0
END AS Promedio
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
WHERE N.IDAlumno = @IdAlumno AND (N.IDEtapa = 1 or N.IDEtapa = 2)
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
GROUP BY M.Nombre, N.IDEtapa
ORDER BY M.Nombre, N.IDEtapa

Devuelve:

Materia IdEtapa Promedio
BIOLOGÍA I 1 6.33
BIOLOGÍA I 2 7.50
HISTORIA I 1 6.00
HISTORIA I 2 4.33
DIBUJO I 1 7.00
EDUCACIÓN FÍSICA I 1 7.50

Y yo quiero que devuelva lo mismo pero con un promedio FINAL ( o sea por ej
para Biologia (6.33+7.50)/2=6.92 )

Materia IdEtapa Promedio PromedioFINAL
BIOLOGÍA I 1 6.33 6.92
BIOLOGÍA I 2 7.50 6.92
HISTORIA I 1 6.00 5.16
HISTORIA I 2 4.33 5.16
DIBUJO I 1 7.00 7.00
EDUCACIÓN FÍSICA I 1 7.50 7.50

Como puedo hacer esto, ademas tengo que tener en cuenta que puede haber
promedio para una sola etapa.
Saludos y gracias

Las tablas son:

NOTAS MATERIAS
-
IdAlumno IdMateria
IdMateria Nombre
IdEtapa
Curso
Orden
Nota
FechaExamen

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
06/04/2005 - 15:05 | Informe spam
Matías,

Chequea el operador ROLLUP en los libros en linea. No expongo un ejemplo
relacionado a tu ambiente porque no posteastes data de ejemplo, asi que usare
la bd Northwind.

Ejemplo:

customer

use northwind
go

select
customerid,
year(orderdate) as [año],
count(*) as num_de_ordenes
from
orders as o
group by
customerid,
year(orderdate) with rollup
order by
case when grouping(customerid) = 1 then 1 else 0 end,
customerid,
(select max(year(oh.orderdate)) from orders as oh where oh.customerid =
o.customerid)
go


AMB


"Matías" wrote:

Hola grupo, tengo el siguiente sp en el cual saco los promedios de las
etapas 1 y 2:

SELECT M.Nombre AS Materia, N.IDEtapa,
CASE WHEN N.IDEtapa = 1 or N.IDEtapa= 2 THEN ROUND(AVG(N.Nota+.0),2) ELSE 0
END AS Promedio
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
WHERE N.IDAlumno = @IdAlumno AND (N.IDEtapa = 1 or N.IDEtapa = 2)
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
GROUP BY M.Nombre, N.IDEtapa
ORDER BY M.Nombre, N.IDEtapa

Devuelve:

Materia IdEtapa Promedio
BIOLOGÍA I 1 6.33
BIOLOGÍA I 2 7.50
HISTORIA I 1 6.00
HISTORIA I 2 4.33
DIBUJO I 1 7.00
EDUCACIÓN FÍSICA I 1 7.50

Y yo quiero que devuelva lo mismo pero con un promedio FINAL ( o sea por ej
para Biologia (6.33+7.50)/2=6.92 )

Materia IdEtapa Promedio PromedioFINAL
BIOLOGÍA I 1 6.33 6.92
BIOLOGÍA I 2 7.50 6.92
HISTORIA I 1 6.00 5.16
HISTORIA I 2 4.33 5.16
DIBUJO I 1 7.00 7.00
EDUCACIÓN FÍSICA I 1 7.50 7.50

Como puedo hacer esto, ademas tengo que tener en cuenta que puede haber
promedio para una sola etapa.
Saludos y gracias

Las tablas son:

NOTAS MATERIAS
-
IdAlumno IdMateria
IdMateria Nombre
IdEtapa
Curso
Orden
Nota
FechaExamen



Respuesta Responder a este mensaje
#2 Matías
06/04/2005 - 15:56 | Informe spam
Hola Alejandro, muchas gracias por responder, una pregunta: a que te referis
con que no postie(o como se diga) data de ejemplo? . Puse el sp, el
resultado que devuelve, el resultado que me hace falta y las tablas. ¿Que
otra data puede faltar?

Saludos y gracias

"Alejandro Mesa" escribió en el
mensaje news:
Matías,

Chequea el operador ROLLUP en los libros en linea. No expongo un ejemplo
relacionado a tu ambiente porque no posteastes data de ejemplo, asi que


usare
la bd Northwind.

Ejemplo:



por
customer

use northwind
go

select
customerid,
year(orderdate) as [año],
count(*) as num_de_ordenes
from
orders as o
group by
customerid,
year(orderdate) with rollup
order by
case when grouping(customerid) = 1 then 1 else 0 end,
customerid,
(select max(year(oh.orderdate)) from orders as oh where oh.customerid > o.customerid)
go


AMB


"Matías" wrote:

> Hola grupo, tengo el siguiente sp en el cual saco los promedios de las
> etapas 1 y 2:
>
> SELECT M.Nombre AS Materia, N.IDEtapa,
> CASE WHEN N.IDEtapa = 1 or N.IDEtapa= 2 THEN ROUND(AVG(N.Nota+.0),2)


ELSE 0
> END AS Promedio
> FROM NOTAS N
> INNER JOIN Materias M ON N.IDMateria = M.IDMateria
> WHERE N.IDAlumno = @IdAlumno AND (N.IDEtapa = 1 or N.IDEtapa = 2)
> AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
> GROUP BY M.Nombre, N.IDEtapa
> ORDER BY M.Nombre, N.IDEtapa
>
> Devuelve:
>
> Materia IdEtapa Promedio
> BIOLOGÍA I 1 6.33
> BIOLOGÍA I 2 7.50
> HISTORIA I 1 6.00
> HISTORIA I 2 4.33
> DIBUJO I 1 7.00
> EDUCACIÓN FÍSICA I 1 7.50
>
> Y yo quiero que devuelva lo mismo pero con un promedio FINAL ( o sea por


ej
> para Biologia (6.33+7.50)/2=6.92 )
>
> Materia IdEtapa Promedio


PromedioFINAL
> BIOLOGÍA I 1 6.33


6.92
> BIOLOGÍA I 2 7.50


6.92
> HISTORIA I 1 6.00


5.16
> HISTORIA I 2 4.33


5.16
> DIBUJO I 1 7.00


7.00
> EDUCACIÓN FÍSICA I 1 7.50 7.50
>
> Como puedo hacer esto, ademas tengo que tener en cuenta que puede haber
> promedio para una sola etapa.
> Saludos y gracias
>
> Las tablas son:
>
> NOTAS MATERIAS
> -
> IdAlumno IdMateria
> IdMateria Nombre
> IdEtapa
> Curso
> Orden
> Nota
> FechaExamen
>
>
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
06/04/2005 - 16:25 | Informe spam
Matías,

No tomes a mal lo dicho. Cuando dije data de ejemplo me referi a la data que
puedo usar para alimentar las tablas y comprobar que el query posteado
funciona. Por ejemplo, posteastes esto:

Las tablas son:

NOTAS MATERIAS
-
IdAlumno IdMateria
IdMateria Nombre
IdEtapa
Curso
Orden
Nota
FechaExamen

pero que hay de los tipos de datos, declaracion de integridad referencial,
etc. Eso, aunque parezca insignificante, es de mucha ayuda para entender el
esquema con el que se trabaja. Preferible algo asi como:

create table dbo.MATERIAS (
IdMateria int not null identity primary key,
Nombre varchar(50) not null unique
)

insert into dbo.MATERIAS (Nombre) values('Materia1')
insert into dbo.MATERIAS (Nombre) values('Materia2')
...

Eso haria que los que tratan de ayudar no tengan que perder tiempo creando
el esquema y llenandolo con data de ejemplo para poder probar la solucion que
se quiere exponer, no crees?


AMB





"Matías" wrote:

Hola Alejandro, muchas gracias por responder, una pregunta: a que te referis
con que no postie(o como se diga) data de ejemplo? . Puse el sp, el
resultado que devuelve, el resultado que me hace falta y las tablas. ¿Que
otra data puede faltar?

Saludos y gracias

"Alejandro Mesa" escribió en el
mensaje news:
> Matías,
>
> Chequea el operador ROLLUP en los libros en linea. No expongo un ejemplo
> relacionado a tu ambiente porque no posteastes data de ejemplo, asi que
usare
> la bd Northwind.
>
> Ejemplo:
>
por
> customer
>
> use northwind
> go
>
> select
> customerid,
> year(orderdate) as [año],
> count(*) as num_de_ordenes
> from
> orders as o
> group by
> customerid,
> year(orderdate) with rollup
> order by
> case when grouping(customerid) = 1 then 1 else 0 end,
> customerid,
> (select max(year(oh.orderdate)) from orders as oh where oh.customerid > > o.customerid)
> go
>
>
> AMB
>
>
> "Matías" wrote:
>
> > Hola grupo, tengo el siguiente sp en el cual saco los promedios de las
> > etapas 1 y 2:
> >
> > SELECT M.Nombre AS Materia, N.IDEtapa,
> > CASE WHEN N.IDEtapa = 1 or N.IDEtapa= 2 THEN ROUND(AVG(N.Nota+.0),2)
ELSE 0
> > END AS Promedio
> > FROM NOTAS N
> > INNER JOIN Materias M ON N.IDMateria = M.IDMateria
> > WHERE N.IDAlumno = @IdAlumno AND (N.IDEtapa = 1 or N.IDEtapa = 2)
> > AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
> > GROUP BY M.Nombre, N.IDEtapa
> > ORDER BY M.Nombre, N.IDEtapa
> >
> > Devuelve:
> >
> > Materia IdEtapa Promedio
> > BIOLOGÍA I 1 6.33
> > BIOLOGÍA I 2 7.50
> > HISTORIA I 1 6.00
> > HISTORIA I 2 4.33
> > DIBUJO I 1 7.00
> > EDUCACIÓN FÍSICA I 1 7.50
> >
> > Y yo quiero que devuelva lo mismo pero con un promedio FINAL ( o sea por
ej
> > para Biologia (6.33+7.50)/2=6.92 )
> >
> > Materia IdEtapa Promedio
PromedioFINAL
> > BIOLOGÍA I 1 6.33
6.92
> > BIOLOGÍA I 2 7.50
6.92
> > HISTORIA I 1 6.00
5.16
> > HISTORIA I 2 4.33
5.16
> > DIBUJO I 1 7.00
7.00
> > EDUCACIÓN FÍSICA I 1 7.50 7.50
> >
> > Como puedo hacer esto, ademas tengo que tener en cuenta que puede haber
> > promedio para una sola etapa.
> > Saludos y gracias
> >
> > Las tablas son:
> >
> > NOTAS MATERIAS
> > -
> > IdAlumno IdMateria
> > IdMateria Nombre
> > IdEtapa
> > Curso
> > Orden
> > Nota
> > FechaExamen
> >
> >
> >



Respuesta Responder a este mensaje
#4 Matías
06/04/2005 - 16:57 | Informe spam
Ok, Alejandro, no tomé a mal lo que pusiste, simplemente preguntaba para
desburrarme un poco. Ya se para la proxima que data enviar.
Voy a intentar hacer funcionar mi select tomando como ejemplo el que hiciste
sobre la Northwind.

Una cosilla: ya que soy medio novato en este tema, como se dice
correctamente: "EL select" o "LA select" lo he visto en este foro que lo
mencionan de las dos formas. A mi me gusta mas "EL select"

Saludos y gracias

"Alejandro Mesa" escribió en el
mensaje news:
Matías,

No tomes a mal lo dicho. Cuando dije data de ejemplo me referi a la data


que
puedo usar para alimentar las tablas y comprobar que el query posteado
funciona. Por ejemplo, posteastes esto:

Las tablas son:

NOTAS MATERIAS
-
IdAlumno IdMateria
IdMateria Nombre
IdEtapa
Curso
Orden
Nota
FechaExamen

pero que hay de los tipos de datos, declaracion de integridad referencial,
etc. Eso, aunque parezca insignificante, es de mucha ayuda para entender


el
esquema con el que se trabaja. Preferible algo asi como:

create table dbo.MATERIAS (
IdMateria int not null identity primary key,
Nombre varchar(50) not null unique
)

insert into dbo.MATERIAS (Nombre) values('Materia1')
insert into dbo.MATERIAS (Nombre) values('Materia2')
...

Eso haria que los que tratan de ayudar no tengan que perder tiempo creando
el esquema y llenandolo con data de ejemplo para poder probar la solucion


que
se quiere exponer, no crees?


AMB





"Matías" wrote:

> Hola Alejandro, muchas gracias por responder, una pregunta: a que te


referis
> con que no postie(o como se diga) data de ejemplo? . Puse el sp, el
> resultado que devuelve, el resultado que me hace falta y las tablas.


¿Que
> otra data puede faltar?
>
> Saludos y gracias
>
> "Alejandro Mesa" escribió en


el
> mensaje news:
> > Matías,
> >
> > Chequea el operador ROLLUP en los libros en linea. No expongo un


ejemplo
> > relacionado a tu ambiente porque no posteastes data de ejemplo, asi


que
> usare
> > la bd Northwind.
> >
> > Ejemplo:
> >


sub-total
> por
> > customer
> >
> > use northwind
> > go
> >
> > select
> > customerid,
> > year(orderdate) as [año],
> > count(*) as num_de_ordenes
> > from
> > orders as o
> > group by
> > customerid,
> > year(orderdate) with rollup
> > order by
> > case when grouping(customerid) = 1 then 1 else 0 end,
> > customerid,
> > (select max(year(oh.orderdate)) from orders as oh where oh.customerid
> > o.customerid)
> > go
> >
> >
> > AMB
> >
> >
> > "Matías" wrote:
> >
> > > Hola grupo, tengo el siguiente sp en el cual saco los promedios de


las
> > > etapas 1 y 2:
> > >
> > > SELECT M.Nombre AS Materia, N.IDEtapa,
> > > CASE WHEN N.IDEtapa = 1 or N.IDEtapa= 2 THEN


ROUND(AVG(N.Nota+.0),2)
> ELSE 0
> > > END AS Promedio
> > > FROM NOTAS N
> > > INNER JOIN Materias M ON N.IDMateria = M.IDMateria
> > > WHERE N.IDAlumno = @IdAlumno AND (N.IDEtapa = 1 or N.IDEtapa = 2)
> > > AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
> > > GROUP BY M.Nombre, N.IDEtapa
> > > ORDER BY M.Nombre, N.IDEtapa
> > >
> > > Devuelve:
> > >
> > > Materia IdEtapa Promedio
> > > BIOLOGÍA I 1 6.33
> > > BIOLOGÍA I 2 7.50
> > > HISTORIA I 1 6.00
> > > HISTORIA I 2 4.33
> > > DIBUJO I 1 7.00
> > > EDUCACIÓN FÍSICA I 1 7.50
> > >
> > > Y yo quiero que devuelva lo mismo pero con un promedio FINAL ( o sea


por
> ej
> > > para Biologia (6.33+7.50)/2=6.92 )
> > >
> > > Materia IdEtapa Promedio
> PromedioFINAL
> > > BIOLOGÍA I 1 6.33
> 6.92
> > > BIOLOGÍA I 2 7.50
> 6.92
> > > HISTORIA I 1 6.00
> 5.16
> > > HISTORIA I 2 4.33
> 5.16
> > > DIBUJO I 1 7.00
> 7.00
> > > EDUCACIÓN FÍSICA I 1 7.50 7.50
> > >
> > > Como puedo hacer esto, ademas tengo que tener en cuenta que puede


haber
> > > promedio para una sola etapa.
> > > Saludos y gracias
> > >
> > > Las tablas son:
> > >
> > > NOTAS MATERIAS
> > > -
> > > IdAlumno IdMateria
> > > IdMateria Nombre
> > > IdEtapa
> > > Curso
> > > Orden
> > > Nota
> > > FechaExamen
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
#5 Alejandro Mesa
06/04/2005 - 17:09 | Informe spam
Matías,

Verdad que no soy ducho en eso de hacer valer la gramatica. SELECT es una
sentencia, por lo que inmagino que cuando escribimos rapido olvidamos decirlo
y ponemos "la select" en vez de "la sentencia select". Si vemos la palabra
como un sustantivo independiente entonces como que deberia ser genero
masculino y decimos "el select". Eso creo.


AMB

"Matías" wrote:

Ok, Alejandro, no tomé a mal lo que pusiste, simplemente preguntaba para
desburrarme un poco. Ya se para la proxima que data enviar.
Voy a intentar hacer funcionar mi select tomando como ejemplo el que hiciste
sobre la Northwind.

Una cosilla: ya que soy medio novato en este tema, como se dice
correctamente: "EL select" o "LA select" lo he visto en este foro que lo
mencionan de las dos formas. A mi me gusta mas "EL select"

Saludos y gracias

"Alejandro Mesa" escribió en el
mensaje news:
> Matías,
>
> No tomes a mal lo dicho. Cuando dije data de ejemplo me referi a la data
que
> puedo usar para alimentar las tablas y comprobar que el query posteado
> funciona. Por ejemplo, posteastes esto:
>
> Las tablas son:
>
> NOTAS MATERIAS
> -
> IdAlumno IdMateria
> IdMateria Nombre
> IdEtapa
> Curso
> Orden
> Nota
> FechaExamen
>
> pero que hay de los tipos de datos, declaracion de integridad referencial,
> etc. Eso, aunque parezca insignificante, es de mucha ayuda para entender
el
> esquema con el que se trabaja. Preferible algo asi como:
>
> create table dbo.MATERIAS (
> IdMateria int not null identity primary key,
> Nombre varchar(50) not null unique
> )
>
> insert into dbo.MATERIAS (Nombre) values('Materia1')
> insert into dbo.MATERIAS (Nombre) values('Materia2')
> ...
>
> Eso haria que los que tratan de ayudar no tengan que perder tiempo creando
> el esquema y llenandolo con data de ejemplo para poder probar la solucion
que
> se quiere exponer, no crees?
>
>
> AMB
>
>
>
>
>
> "Matías" wrote:
>
> > Hola Alejandro, muchas gracias por responder, una pregunta: a que te
referis
> > con que no postie(o como se diga) data de ejemplo? . Puse el sp, el
> > resultado que devuelve, el resultado que me hace falta y las tablas.
¿Que
> > otra data puede faltar?
> >
> > Saludos y gracias
> >
> > "Alejandro Mesa" escribió en
el
> > mensaje news:
> > > Matías,
> > >
> > > Chequea el operador ROLLUP en los libros en linea. No expongo un
ejemplo
> > > relacionado a tu ambiente porque no posteastes data de ejemplo, asi
que
> > usare
> > > la bd Northwind.
> > >
> > > Ejemplo:
> > >
sub-total
> > por
> > > customer
> > >
> > > use northwind
> > > go
> > >
> > > select
> > > customerid,
> > > year(orderdate) as [año],
> > > count(*) as num_de_ordenes
> > > from
> > > orders as o
> > > group by
> > > customerid,
> > > year(orderdate) with rollup
> > > order by
> > > case when grouping(customerid) = 1 then 1 else 0 end,
> > > customerid,
> > > (select max(year(oh.orderdate)) from orders as oh where oh.customerid
> > > > o.customerid)
> > > go
> > >
> > >
> > > AMB
> > >
> > >
> > > "Matías" wrote:
> > >
> > > > Hola grupo, tengo el siguiente sp en el cual saco los promedios de
las
> > > > etapas 1 y 2:
> > > >
> > > > SELECT M.Nombre AS Materia, N.IDEtapa,
> > > > CASE WHEN N.IDEtapa = 1 or N.IDEtapa= 2 THEN
ROUND(AVG(N.Nota+.0),2)
> > ELSE 0
> > > > END AS Promedio
> > > > FROM NOTAS N
> > > > INNER JOIN Materias M ON N.IDMateria = M.IDMateria
> > > > WHERE N.IDAlumno = @IdAlumno AND (N.IDEtapa = 1 or N.IDEtapa = 2)
> > > > AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
> > > > GROUP BY M.Nombre, N.IDEtapa
> > > > ORDER BY M.Nombre, N.IDEtapa
> > > >
> > > > Devuelve:
> > > >
> > > > Materia IdEtapa Promedio
> > > > BIOLOGÍA I 1 6.33
> > > > BIOLOGÍA I 2 7.50
> > > > HISTORIA I 1 6.00
> > > > HISTORIA I 2 4.33
> > > > DIBUJO I 1 7.00
> > > > EDUCACIÓN FÍSICA I 1 7.50
> > > >
> > > > Y yo quiero que devuelva lo mismo pero con un promedio FINAL ( o sea
por
> > ej
> > > > para Biologia (6.33+7.50)/2=6.92 )
> > > >
> > > > Materia IdEtapa Promedio
> > PromedioFINAL
> > > > BIOLOGÍA I 1 6.33
> > 6.92
> > > > BIOLOGÍA I 2 7.50
> > 6.92
> > > > HISTORIA I 1 6.00
> > 5.16
> > > > HISTORIA I 2 4.33
> > 5.16
> > > > DIBUJO I 1 7.00
> > 7.00
> > > > EDUCACIÓN FÍSICA I 1 7.50 7.50
> > > >
> > > > Como puedo hacer esto, ademas tengo que tener en cuenta que puede
haber
> > > > promedio para una sola etapa.
> > > > Saludos y gracias
> > > >
> > > > Las tablas son:
> > > >
> > > > NOTAS MATERIAS
> > > > -
> > > > IdAlumno IdMateria
> > > > IdMateria Nombre
> > > > IdEtapa
> > > > Curso
> > > > Orden
> > > > Nota
> > > > FechaExamen
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida