SELECT dentro de SELECT

28/05/2009 - 19:16 por Angel Zapata | Informe spam
Estoy intentando hacer una consulta en la que varios campos salen de
consultas de totales de otras tablas, es decir:

Tengo un agente en la tabla Agentes, puede tener Abonos, Cargos o Anticipos
que están grabados en otras tablas de igual nombre y me gustaria tener un
registro solo con:
Agente, TotalAbonos, TotalCargos y TotalAnticipos que no hayan sido
procesados.

La consulta que ejecuto es la siguiente pero no me devuelve nada si en una
de las tablas secundarias no hay registros.

SELECT dbo.Agente.AgeCodigo,
(SELECT SUM(dbo.AgenteAbono.AboImporte)
FROM AgenteAbono
WHERE (AboAgeCodigo = 1) AND
(AboFechaComision IS NULL)) AS Abonos,
(SELECT SUM(dbo.AgenteAnticipo.AntCantidad)
FROM AgenteAnticipo
WHERE (AntAgeCodigo = 1) AND
(AntFechaComision IS NULL)) AS Anticipos,
(SELECT SUM(dbo.AgenteCargo.CarImporte)
FROM AgenteCargo
WHERE (CarAgeCodigo = 1) AND
(CarFechaComision IS NULL)) AS Cargos
FROM dbo.Agente FULL OUTER JOIN
dbo.AgenteCargo ON dbo.Agente.AgeCodigo =
dbo.AgenteCargo.CarAgeCodigo FULL OUTER JOIN
dbo.AgenteAnticipo ON dbo.Agente.AgeCodigo =
dbo.AgenteAnticipo.AntAgeCodigo FULL OUTER JOIN
dbo.AgenteAbono ON dbo.Agente.AgeCodigo =
dbo.AgenteAbono.AboAgeCodigo
WHERE (dbo.AgenteAbono.AboFechaComision IS NULL) AND
(dbo.AgenteAnticipo.AntFechaComision IS NULL) AND
(dbo.AgenteCargo.CarFechaComision IS NULL)
GROUP BY dbo.Agente.AgeCodigo
HAVING (dbo.Agente.AgeCodigo = 1)

Por favor, a los gurus de SQL, una ayudita.

Muchas gracias
Angel Zapata

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
28/05/2009 - 19:57 | Informe spam
Angel Zapata,

Debes calcular las sumas por separado (tablas derivadas) y luego hacer el
join. Algo asi como:

SELECT
a.AgeCodigo,
ISNULL(abo.sum_AboImporte, 0) AS Abonos,
ISNULL(ant.sum_AntCantidad, 0) AS Anticipos,
ISNULL(car.sum_CarImporte, 0) AS Cargos
FROM
dbo.Agente AS a
LEFT OUTER JOIN
(
SELECT AboAgeCodigo, SUM(AboImporte) AS sum_AboImporte
FROM AgenteAbono
WHERE (AboAgeCodigo = 1) AND (AboFechaComision IS NULL)
GROUP BY AboAgeCodigo
) AS abo
ON a.AgeCodigo = abo.AboAgeCodigo
LEFT OUTER JOIN
(
SELECT AntAgeCodigo, SUM(AntCantidad) AS sum_AntCantidad
FROM AgenteAnticipo
WHERE (AntAgeCodigo = 1) AND (AntFechaComision IS NULL)
GROUP BY AntAgeCodigo
) ant
ON a.AgeCodigo = ant.AntAgeCodigo
LEFT OUTER JOIN
(
SELECT CarAgeCodigo, SUM(CarImporte) AS sum_CarImporte
FROM AgenteCargo
WHERE (CarAgeCodigo = 1) AND (CarFechaComision IS NULL)
GROUP BY CarAgeCodigo
) AS car
ON a.AgeCodigo = car.CarAgeCodigo
WHERE
a.AgeCodigo = 1;
GO



AMB





"Angel Zapata" wrote:

Estoy intentando hacer una consulta en la que varios campos salen de
consultas de totales de otras tablas, es decir:

Tengo un agente en la tabla Agentes, puede tener Abonos, Cargos o Anticipos
que están grabados en otras tablas de igual nombre y me gustaria tener un
registro solo con:
Agente, TotalAbonos, TotalCargos y TotalAnticipos que no hayan sido
procesados.

La consulta que ejecuto es la siguiente pero no me devuelve nada si en una
de las tablas secundarias no hay registros.

SELECT dbo.Agente.AgeCodigo,
(SELECT SUM(dbo.AgenteAbono.AboImporte)
FROM AgenteAbono
WHERE (AboAgeCodigo = 1) AND
(AboFechaComision IS NULL)) AS Abonos,
(SELECT SUM(dbo.AgenteAnticipo.AntCantidad)
FROM AgenteAnticipo
WHERE (AntAgeCodigo = 1) AND
(AntFechaComision IS NULL)) AS Anticipos,
(SELECT SUM(dbo.AgenteCargo.CarImporte)
FROM AgenteCargo
WHERE (CarAgeCodigo = 1) AND
(CarFechaComision IS NULL)) AS Cargos
FROM dbo.Agente FULL OUTER JOIN
dbo.AgenteCargo ON dbo.Agente.AgeCodigo =
dbo.AgenteCargo.CarAgeCodigo FULL OUTER JOIN
dbo.AgenteAnticipo ON dbo.Agente.AgeCodigo =
dbo.AgenteAnticipo.AntAgeCodigo FULL OUTER JOIN
dbo.AgenteAbono ON dbo.Agente.AgeCodigo =
dbo.AgenteAbono.AboAgeCodigo
WHERE (dbo.AgenteAbono.AboFechaComision IS NULL) AND
(dbo.AgenteAnticipo.AntFechaComision IS NULL) AND
(dbo.AgenteCargo.CarFechaComision IS NULL)
GROUP BY dbo.Agente.AgeCodigo
HAVING (dbo.Agente.AgeCodigo = 1)

Por favor, a los gurus de SQL, una ayudita.

Muchas gracias
Angel Zapata



Respuesta Responder a este mensaje
#2 Angel Zapata
29/05/2009 - 09:15 | Informe spam
Gracias Alejandro por la respuesta, nunca lo hubiera planteado así, con lo
que algo he aprendido hoy.

Muchas gracias
Angel Zapata

"Alejandro Mesa" escribió en el
mensaje news:
Angel Zapata,

Debes calcular las sumas por separado (tablas derivadas) y luego hacer el
join. Algo asi como:

SELECT
a.AgeCodigo,
ISNULL(abo.sum_AboImporte, 0) AS Abonos,
ISNULL(ant.sum_AntCantidad, 0) AS Anticipos,
ISNULL(car.sum_CarImporte, 0) AS Cargos
FROM
dbo.Agente AS a
LEFT OUTER JOIN
(
SELECT AboAgeCodigo, SUM(AboImporte) AS sum_AboImporte
FROM AgenteAbono
WHERE (AboAgeCodigo = 1) AND (AboFechaComision IS NULL)
GROUP BY AboAgeCodigo
) AS abo
ON a.AgeCodigo = abo.AboAgeCodigo
LEFT OUTER JOIN
(
SELECT AntAgeCodigo, SUM(AntCantidad) AS sum_AntCantidad
FROM AgenteAnticipo
WHERE (AntAgeCodigo = 1) AND (AntFechaComision IS NULL)
GROUP BY AntAgeCodigo
) ant
ON a.AgeCodigo = ant.AntAgeCodigo
LEFT OUTER JOIN
(
SELECT CarAgeCodigo, SUM(CarImporte) AS sum_CarImporte
FROM AgenteCargo
WHERE (CarAgeCodigo = 1) AND (CarFechaComision IS NULL)
GROUP BY CarAgeCodigo
) AS car
ON a.AgeCodigo = car.CarAgeCodigo
WHERE
a.AgeCodigo = 1;
GO



AMB





"Angel Zapata" wrote:

Estoy intentando hacer una consulta en la que varios campos salen de
consultas de totales de otras tablas, es decir:

Tengo un agente en la tabla Agentes, puede tener Abonos, Cargos o
Anticipos
que están grabados en otras tablas de igual nombre y me gustaria tener un
registro solo con:
Agente, TotalAbonos, TotalCargos y TotalAnticipos que no hayan sido
procesados.

La consulta que ejecuto es la siguiente pero no me devuelve nada si en
una
de las tablas secundarias no hay registros.

SELECT dbo.Agente.AgeCodigo,
(SELECT SUM(dbo.AgenteAbono.AboImporte)
FROM AgenteAbono
WHERE (AboAgeCodigo = 1) AND
(AboFechaComision IS NULL)) AS Abonos,
(SELECT SUM(dbo.AgenteAnticipo.AntCantidad)
FROM AgenteAnticipo
WHERE (AntAgeCodigo = 1) AND
(AntFechaComision IS NULL)) AS Anticipos,
(SELECT SUM(dbo.AgenteCargo.CarImporte)
FROM AgenteCargo
WHERE (CarAgeCodigo = 1) AND
(CarFechaComision IS NULL)) AS Cargos
FROM dbo.Agente FULL OUTER JOIN
dbo.AgenteCargo ON dbo.Agente.AgeCodigo >> dbo.AgenteCargo.CarAgeCodigo FULL OUTER JOIN
dbo.AgenteAnticipo ON dbo.Agente.AgeCodigo >> dbo.AgenteAnticipo.AntAgeCodigo FULL OUTER JOIN
dbo.AgenteAbono ON dbo.Agente.AgeCodigo >> dbo.AgenteAbono.AboAgeCodigo
WHERE (dbo.AgenteAbono.AboFechaComision IS NULL) AND
(dbo.AgenteAnticipo.AntFechaComision IS NULL) AND
(dbo.AgenteCargo.CarFechaComision IS NULL)
GROUP BY dbo.Agente.AgeCodigo
HAVING (dbo.Agente.AgeCodigo = 1)

Por favor, a los gurus de SQL, una ayudita.

Muchas gracias
Angel Zapata



Respuesta Responder a este mensaje
#3 demegares
17/08/2013 - 14:17 | Informe spam
Angel Zapata escribió el 28/05/2009 19:16 :
Estoy intentando hacer una consulta en la que varios campos salen de
consultas de totales de otras tablas, es decir:

Tengo un agente en la tabla Agentes, puede tener Abonos, Cargos o Anticipos
que están grabados en otras tablas de igual nombre y me gustaria tener
un
registro solo con:
Agente, TotalAbonos, TotalCargos y TotalAnticipos que no hayan sido
procesados.

La consulta que ejecuto es la siguiente pero no me devuelve nada si en una
de las tablas secundarias no hay registros.

SELECT dbo.Agente.AgeCodigo,
(SELECT SUM(dbo.AgenteAbono.AboImporte)
FROM AgenteAbono
WHERE (AboAgeCodigo = 1) AND
(AboFechaComision IS NULL)) AS Abonos,
(SELECT SUM(dbo.AgenteAnticipo.AntCantidad)
FROM AgenteAnticipo
WHERE (AntAgeCodigo = 1) AND
(AntFechaComision IS NULL)) AS Anticipos,
(SELECT SUM(dbo.AgenteCargo.CarImporte)
FROM AgenteCargo
WHERE (CarAgeCodigo = 1) AND
(CarFechaComision IS NULL)) AS Cargos
FROM dbo.Agente FULL OUTER JOIN
dbo.AgenteCargo ON dbo.Agente.AgeCodigo =
dbo.AgenteCargo.CarAgeCodigo FULL OUTER JOIN
dbo.AgenteAnticipo ON dbo.Agente.AgeCodigo =
dbo.AgenteAnticipo.AntAgeCodigo FULL OUTER JOIN
dbo.AgenteAbono ON dbo.Agente.AgeCodigo =
dbo.AgenteAbono.AboAgeCodigo
WHERE (dbo.AgenteAbono.AboFechaComision IS NULL) AND
(dbo.AgenteAnticipo.AntFechaComision IS NULL) AND
(dbo.AgenteCargo.CarFechaComision IS NULL)
GROUP BY dbo.Agente.AgeCodigo
HAVING (dbo.Agente.AgeCodigo = 1)

Por favor, a los gurus de SQL, una ayudita.

Muchas gracias
Angel Zapata


Gracias, ami tambien me sirvio mucho y me ayudo a continuar con el resto del codigo

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