Where de un campo creado por una subconsulta

29/12/2005 - 14:39 por Matías | Informe spam
Hola a todos, como se puede hacer para poner como condicion en el where el
valor de un campo creado por una subconsulta, algo así:

Select campo1, campo2, promedio = (Select AVG(Campo3))
From Mitabla
Where promedio > 6

claro que de esta manera me salta el mensaje 'la columna promedio no existe'

Saludos y mil gracias.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristán
29/12/2005 - 15:04 | Informe spam
Poniéndolo en la cláusula correspondiente...

SELECT campo1, campo2
FROM miTabla
WHERE promedio = (SELECT AVG(campo3) FROM miTabla)


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Matías" escribió en el mensaje
news:
Hola a todos, como se puede hacer para poner como condicion en el where el
valor de un campo creado por una subconsulta, algo así:

Select campo1, campo2, promedio = (Select AVG(Campo3))
From Mitabla
Where promedio > 6

claro que de esta manera me salta el mensaje 'la columna promedio no


existe'

Saludos y mil gracias.


Respuesta Responder a este mensaje
#2 Alejandro Mesa
29/12/2005 - 15:41 | Informe spam
Matías,

No se si entendi bien el ejemplo. La columna calculada no tiene relacion con
los valores de la fila que se procesa, por lo que ese valor sera el mismo
para todas las filas del resultado, al menor eso es lo que parece en el
ejemplo que posteastes. En este caso tendrias que usar una expresion logica
fuera de la sentencia.

if (select avg(campo3) from ...) > 6
begin
select campo1, campo2, (select avg(campo3) from ...)
from ...
end

Si la columna calculada depende de las columnas campo1 y campo2, entonces
puedes hacer el filtro usando la clausula "having".

select campo1, campo2, avg(campo3)
from tabla1
group by campo1, campo2
havinh avg(campo3) > 6

si la relacion de la columna calculada no es tan directa como en el paso
anterior, entonces puedes usar una tabla derivada.

select *
from
(
select campo1, campo2, (select avg(campo3) from ...) as promedio
from tabla1
) as a
where promedio > 6


AMB

"Matías" wrote:

Hola a todos, como se puede hacer para poner como condicion en el where el
valor de un campo creado por una subconsulta, algo así:

Select campo1, campo2, promedio = (Select AVG(Campo3))
From Mitabla
Where promedio > 6

claro que de esta manera me salta el mensaje 'la columna promedio no existe'

Saludos y mil gracias.



Respuesta Responder a este mensaje
#3 Matías
29/12/2005 - 16:21 | Informe spam
OK, GRACIAS, pero tambien me hace falta mostrar el promedio, si solamente lo
pongo en el where no o voy a poder ver, supongo q deberia hacer algo asi?:

SELECT campo1, campo2, promedio = (SELECT AVG(campo3) FROM miTabla)
FROM miTabla
WHERE promedio = (SELECT AVG(campo3) FROM miTabla)




"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:
Poniéndolo en la cláusula correspondiente...

SELECT campo1, campo2
FROM miTabla
WHERE promedio = (SELECT AVG(campo3) FROM miTabla)


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Matías" escribió en el mensaje
news:
> Hola a todos, como se puede hacer para poner como condicion en el where


el
> valor de un campo creado por una subconsulta, algo así:
>
> Select campo1, campo2, promedio = (Select AVG(Campo3))
> From Mitabla
> Where promedio > 6
>
> claro que de esta manera me salta el mensaje 'la columna promedio no
existe'
>
> Saludos y mil gracias.
>
>


Respuesta Responder a este mensaje
#4 Matías
29/12/2005 - 17:47 | Informe spam
OK, gracias, expuse un ejmplo un poco "choto", ya que el select original es
un poco complicado y tiene varias codiciones, pero voy a probar con las
alterntivas q me diste.
Te copio el select por las dudas:

SELECT A.Apellidos+', '+ A.Nombres as Alumno, A.Legajo, A.NroDocumento,
N.IDAlumno, N.IDMateria,
M.Codigo, M.Nombre as Materia,
PromPrimEtapa = (SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 1 AND N.IDMateria = 4 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE()) AND
A.Curso = '1AM'),
PromSegEtapa = (SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDMateria = 4 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE()) AND
A.Curso = '1AM'),
ROUND(((SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 1 AND N.IDMateria = 4 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE()) AND A.Curso
= '1AM')
+
(SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDMateria = 4 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE()) AND
A.Curso = '1AM'))/2, 2) as PromedioFinal
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
WHERE DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
AND (N.IDEtapa = 1 or N.IDEtapa = 2) AND N.IDMateria = 4 AND A.Curso '1AM' AND PromedioFinal < 6 -- ******** aqui es el promema ******
GROUP BY A.Apellidos, A.Nombres, A.Legajo, A.NroDocumento, N.IDAlumno,
N.IDMateria, M.Codigo,
M.Nombre, A.IDAlumno, A.Curso, A.IDAlumno

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

No se si entendi bien el ejemplo. La columna calculada no tiene relacion


con
los valores de la fila que se procesa, por lo que ese valor sera el mismo
para todas las filas del resultado, al menor eso es lo que parece en el
ejemplo que posteastes. En este caso tendrias que usar una expresion


logica
fuera de la sentencia.

if (select avg(campo3) from ...) > 6
begin
select campo1, campo2, (select avg(campo3) from ...)
from ...
end

Si la columna calculada depende de las columnas campo1 y campo2, entonces
puedes hacer el filtro usando la clausula "having".

select campo1, campo2, avg(campo3)
from tabla1
group by campo1, campo2
havinh avg(campo3) > 6

si la relacion de la columna calculada no es tan directa como en el paso
anterior, entonces puedes usar una tabla derivada.

select *
from
(
select campo1, campo2, (select avg(campo3) from ...) as promedio
from tabla1
) as a
where promedio > 6


AMB

"Matías" wrote:

> Hola a todos, como se puede hacer para poner como condicion en el where


el
> valor de un campo creado por una subconsulta, algo así:
>
> Select campo1, campo2, promedio = (Select AVG(Campo3))
> From Mitabla
> Where promedio > 6
>
> claro que de esta manera me salta el mensaje 'la columna promedio no


existe'
>
> Saludos y mil gracias.
>
>
>
Respuesta Responder a este mensaje
#5 Matías
29/12/2005 - 21:30 | Informe spam
Lo solucione usando una consulta derivada, pero tengo un problema, no puedo
poner Order By Apellidos, Nombres
Como hago?

SELECT * FROM(
SELECT A.Apellidos+', '+ A.Nombres as Alumno, A.Legajo, A.NroDocumento,
N.IDAlumno, N.IDMateria,
M.Codigo, M.Nombre as Materia,
ROUND(((SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 1 AND N.IDMateria = 4 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE()) AND A.Curso
= '1AM')
+
(SELECT ROUND(AVG(CAST(N.Nota as FLOAT)),2)
FROM NOTAS N
WHERE N.IDEtapa = 2 AND N.IDMateria = 4 AND N.IDAlumno = A.IDAlumno
AND DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE()) AND
A.Curso = '1AM'))/2, 2) PromedioFinal
FROM NOTAS N
INNER JOIN Materias M ON N.IDMateria = M.IDMateria
INNER JOIN Etapas E ON N.IDEtapa = E.IDEtapa
INNER JOIN Alumnos A ON N.IDAlumno = A.IDAlumno
WHERE DATEPART(yyyy, N.FechaExamen) = DATEPART(yyyy, GETDATE())
AND (N.IDEtapa = 1 or N.IDEtapa = 2) AND N.IDMateria = 4 AND A.Curso '1AM'
GROUP BY A.Apellidos, A.Nombres, A.Legajo, A.NroDocumento, N.IDAlumno,
N.IDMateria, M.Codigo,
M.Nombre, A.IDAlumno, A.Curso, A.IDAlumno) AS prom
WHERE PromedioFinal < 6 -- si lo pongo aqui me dice columna invalida, si lo
pongo debajo del Gruop By me tira: The ORDER BY clause is invalid in views,
inline functions, derived tables

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