Calculos con columnas de sub consulas

30/03/2005 - 20:55 por Matías | Informe spam
Hola estimado grupo, quisiera saber como hago para hacer calculos con
columnas generadas mediante sub-consultas, en este caso quiero sacar el
promedio de las columnas "PromPrimEtapa" y "PromSegEtapa", he intentado pero
me salta error que no son nombres de columnas, el sp es el sig:

SELECT N.IDMateria, N.IDEtapa, N.Curso, N.Orden, N.Nota, E.Descripcion as
Etapa, CONVERT(char(10),N.FechaExamen,103) AS FechaExamen,
M.Codigo, M.Nombre as Materia,
PromPrimEtapa = (SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 1 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE())),
PromSegEtapa = (SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 2 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE()))
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
WHERE N.IDAlumno = @IDAlumno AND DATEPART(yyyy, N.FechaExamen) DATEPART(yyyy, GETDATE()) AND N.IDEtapa = 1 or N.IDEtapa = 2
ORDER BY M.Nombre, E.IDEtapa

Una forma seria hacer nuevamente las subconsultas y sobre estas el calculo,
pero no quiero hacer esto ya que el tiempo se eleva al doble. Ej:
PromFin = (
(SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 1 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE()))
+
(SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 2 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE())))/2

Saludos y gracias
 

Leer las respuestas

#1 Alejandro Mesa
30/03/2005 - 22:41 | Informe spam
Trata:

SELECT
N.IDMateria,
N.IDEtapa,
N.Curso,
N.Orden,
N.Nota,
E.Descripcion as Etapa,
CONVERT(char(10),N.FechaExamen,103) AS FechaExamen,
M.Codigo,
M.Nombre as Materia,
p.PromPrimEtapa,
p.PromSegEtapa,
as (p.PromPrimEtapa + p.PromSegEtapa) / 2.00 PromFin
FROM
NOTAS N
INNER JOIN Materias M
ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E
ON N.IDEtapa = E.IDEtapa
inner join
(
SELECT
IDAlumno,
isnull(ROUND(AVG(case when IDEtapa = 1 then Nota + .0 end),2), 0) as
PromPrimEtapa,
isnull(ROUND(AVG(case when IDEtapa = 2 then Nota + .0 end),2), 0) as
PromSegEtapa
FROM
NOTAS
WHERE
IDAlumno = @IDAlumno
and (FechaExamen >= ltrim(year(getdate())) + '0101' and FechaExamen <
ltrim(year(getdate()) + 1) + '0101')
AND (IDEtapa = 1 or IDEtapa = 2)
group by
IDAlumno
) as p
on n.IDAlumno = p.IDAlumno
WHERE
N.IDAlumno = @IDAlumno
AND (FechaExamen >= ltrim(year(getdate())) + '0101' and FechaExamen <
ltrim(year(getdate()) + 1) + '0101')
AND (N.IDEtapa = 1 or N.IDEtapa = 2)
ORDER BY
M.Nombre, E.IDEtapa;


AMB


"Matías" wrote:

Hola estimado grupo, quisiera saber como hago para hacer calculos con
columnas generadas mediante sub-consultas, en este caso quiero sacar el
promedio de las columnas "PromPrimEtapa" y "PromSegEtapa", he intentado pero
me salta error que no son nombres de columnas, el sp es el sig:

SELECT N.IDMateria, N.IDEtapa, N.Curso, N.Orden, N.Nota, E.Descripcion as
Etapa, CONVERT(char(10),N.FechaExamen,103) AS FechaExamen,
M.Codigo, M.Nombre as Materia,
PromPrimEtapa = (SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 1 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE())),
PromSegEtapa = (SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 2 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE()))
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
WHERE N.IDAlumno = @IDAlumno AND DATEPART(yyyy, N.FechaExamen) > DATEPART(yyyy, GETDATE()) AND N.IDEtapa = 1 or N.IDEtapa = 2
ORDER BY M.Nombre, E.IDEtapa

Una forma seria hacer nuevamente las subconsultas y sobre estas el calculo,
pero no quiero hacer esto ya que el tiempo se eleva al doble. Ej:
PromFin = (
(SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 1 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE()))
+
(SELECT ROUND(AVG(N.Nota+.0),2)
FROM NOTAS N
WHERE N.IDAlumno = @IDAlumno AND N.IDEtapa = 2 AND DATEPART(yyyy,
N.FechaExamen) = DATEPART(yyyy, GETDATE())))/2

Saludos y gracias




Preguntas similares