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

Preguntas similare

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




Respuesta Responder a este mensaje
#2 Maxi
30/03/2005 - 22:45 | Informe spam
Hola, una forma seria esa :(, ojo que el uso de subconsultas puede poner muy
lento el sistema. No mire si esta consulta se puede hacer sin las sub, pero
a la noche me fijo y quizas le podamos buscar otra solucion


Salu2
Maxi


"Matías" escribió en el mensaje
news:%
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



Respuesta Responder a este mensaje
#3 Matías
30/03/2005 - 22:47 | Informe spam
Gracias... lo voy probar.
Respuesta Responder a este mensaje
#4 Matías
30/03/2005 - 23:23 | Informe spam
OK, gracias...

"Maxi" escribió en el mensaje
news:%23J1$
Hola, una forma seria esa :(, ojo que el uso de subconsultas puede poner


muy
lento el sistema. No mire si esta consulta se puede hacer sin las sub,


pero
a la noche me fijo y quizas le podamos buscar otra solucion


Salu2
Maxi


"Matías" escribió en el mensaje
news:%
> 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
>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida