Ayuda ! SELECT totales

17/11/2007 - 18:19 por Diego Romero | Informe spam
Hola
Como estan ?

Necesito hacer una consulta agrupada, a ver si se puede:
LAS TABLAS:

1. Facturas:
NumFactura (Clave primaria)
Cliente
ValorACargo

2. Recibos:
NumRecibo (clave primaria)
NumFactura (numero de factura que se abona)
ValorAbonado

Los resultados que se quieren:
Cliente TotalFacturas,TotalAbonado
==
Cree la consulta, pero lógicamente cuando hay mas de un recibo por factura
se duplica el total de facturas.

SELECT Cliente, SUM(ValorACargo) AS TotalFacturas, SUM(ValorAbonado) AS
TotalAbonado
FROM Facturas LEFT JOIN Recibos ON Facturas.NumFactura = Recibos.NumFactura
GROUP BY Cliente

Ejemplo:
NumFactura ,Cliente ,ValorACargo
1, 1,$100000
2,1,$50000
3,2,100000

Recibos:
NumRecibo ,NumFactura ,ValorAbonado
501,1,$20000
505,1,$40000
510,3,$100000

los resultados

Cliente, TotalFacturas,TotalAbonado
1,250000,60000 (la fila esperada es 1,150000,60000)
2,100000,100000

Espero me pueda ayudar.


Diego M Romero

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
18/11/2007 - 16:35 | Informe spam
Hola Carlos,

Tienes toda la razon. No se por que he insistido en relacionar ambas tablas
mediante la columna [Cliente]. Lo que mas me llama la atencion es lo
persistente que he sido.

:-(

Good catch!

AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 18 nov, 02:41, Alejandro Mesa
wrote:
> Carlos M. Calvelo,
>
> No exactamente, pero la condicion en la clausula "where"que utilice no es la
> correcta. En este caso se debe hacer la relacion por clientes.
>
> select
> Cliente,
> SUM(ValorACargo) AS TotalFacturas,
> (
> select SUM(ValorAbonado)
> from Recibos
> where Recibos.Cliente = Facturas.Cliente
> ) AS TotalAbonado
> from
> Facturas
> group by
> Cliente
> GO

Eso no va a funcionar. La tabla Recibos no tiene un atributo
Cliente. Tiene un atributo NumFactura y en Facturas está el cliente.


>
> Tambien se pueden hacer dos tablas derivadas, que son la agrupacion por
> cliente de facturas y de recibos.
>
> select
> coalesce(f.Cliente, r.Cliente) as Cliente,
> f.sum_ValorACargo,
> r.sum_ValorAbonado
> from
> (
> select Cliente, SUM(ValorACargo) as sum_ValorACargo
> from Facturas
> group by Cliente
> ) as f
> full outer join
> (
> select Cliente, SUM(ValorAbonado) as sum_ValorAbonado
> from Recibos
> group by Cliente
> ) as r
> on f.Cliente = r.Cliente
> GO
>

Lo mismo que arriba: La tabla Recibos no tiene un atributo Cliente.


> Si existe una restriccion de integrida referencial desde Recibos hacia
> Facturas, entonces se puede usar un LEFT OUTER JOIN con toda confianza.

Dada la extructura que presenta Diego (con comentario) creo que
podemos asumir eso; que NumFactura en Recibos es una referencia
a Facturas.

Con tablas derivadas yo lo hubiera hecho así:

select F.Cliente,
SUM(F.ValorACargo) as TotalFacturas,
SUM(R.TotalFacturaAbonado) as TotalAbonado
from Facturas F
left join
(
select NumFactura, SUM(ValorAbonado) as TotalFacturaAbonado
from Recibos
group by NumFactura
) R
on F.NumFactura = R.NumFactura
group by
Cliente

Esta y mi anterior propuesta funcionan como yo entiendo que
Diego quiere.
En tus propuestas estás asumiendo que la tabla Recibos
tiene un atributo Cliente. Pero según la información que
Diego ha dado, eso no es así.

Saludos,
Carlos

Respuesta Responder a este mensaje
#7 Salvador Ramos
18/11/2007 - 20:17 | Informe spam
Perdón, esto sólo es válido para obtener una linea por factura (con todos
sus recibos), no un total por cliente. Entendí mal.

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Salvador Ramos" escribió en el
mensaje news:
Hola,

Como el valorCargo será el mismo para todos los recibos de una factura,
puedes poner min(valorCargo) o max(valorCargo) en lugar de
sum(valorCargo).

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Diego Romero" escribió en el mensaje
news:
Hola
Como estan ?

Necesito hacer una consulta agrupada, a ver si se puede:
LAS TABLAS:

1. Facturas:
NumFactura (Clave primaria)
Cliente
ValorACargo

2. Recibos:
NumRecibo (clave primaria)
NumFactura (numero de factura que se abona)
ValorAbonado

Los resultados que se quieren:
Cliente TotalFacturas,TotalAbonado
== >>
Cree la consulta, pero lógicamente cuando hay mas de un recibo por
factura se duplica el total de facturas.

SELECT Cliente, SUM(ValorACargo) AS TotalFacturas, SUM(ValorAbonado) AS
TotalAbonado
FROM Facturas LEFT JOIN Recibos ON Facturas.NumFactura =
Recibos.NumFactura
GROUP BY Cliente

Ejemplo:
NumFactura ,Cliente ,ValorACargo
1, 1,$100000
2,1,$50000
3,2,100000

Recibos:
NumRecibo ,NumFactura ,ValorAbonado
501,1,$20000
505,1,$40000
510,3,$100000

los resultados

Cliente, TotalFacturas,TotalAbonado
1,250000,60000 (la fila esperada es 1,150000,60000)
2,100000,100000

Espero me pueda ayudar.


Diego M Romero





Respuesta Responder a este mensaje
#8 Diego Romero
19/11/2007 - 14:09 | Informe spam
Gracias a todos por sus respuestas,

Efectivamente, la tabla recibos si tiene una columna cliente.

Voy a probar esta instrucción.



Diego M Romero


"Carlos M. Calvelo" escribió en el mensaje
news:
Hola Alejandro,

On 18 nov, 02:41, Alejandro Mesa
wrote:
Carlos M. Calvelo,

No exactamente, pero la condicion en la clausula "where"que utilice no es
la
correcta. En este caso se debe hacer la relacion por clientes.

select
Cliente,
SUM(ValorACargo) AS TotalFacturas,
(
select SUM(ValorAbonado)
from Recibos
where Recibos.Cliente = Facturas.Cliente
) AS TotalAbonado
from
Facturas
group by
Cliente
GO



Eso no va a funcionar. La tabla Recibos no tiene un atributo
Cliente. Tiene un atributo NumFactura y en Facturas está el cliente.



Tambien se pueden hacer dos tablas derivadas, que son la agrupacion por
cliente de facturas y de recibos.

select
coalesce(f.Cliente, r.Cliente) as Cliente,
f.sum_ValorACargo,
r.sum_ValorAbonado
from
(
select Cliente, SUM(ValorACargo) as sum_ValorACargo
from Facturas
group by Cliente
) as f
full outer join
(
select Cliente, SUM(ValorAbonado) as sum_ValorAbonado
from Recibos
group by Cliente
) as r
on f.Cliente = r.Cliente
GO




Lo mismo que arriba: La tabla Recibos no tiene un atributo Cliente.


Si existe una restriccion de integrida referencial desde Recibos hacia
Facturas, entonces se puede usar un LEFT OUTER JOIN con toda confianza.



Dada la extructura que presenta Diego (con comentario) creo que
podemos asumir eso; que NumFactura en Recibos es una referencia
a Facturas.

Con tablas derivadas yo lo hubiera hecho así:

select F.Cliente,
SUM(F.ValorACargo) as TotalFacturas,
SUM(R.TotalFacturaAbonado) as TotalAbonado
from Facturas F
left join
(
select NumFactura, SUM(ValorAbonado) as TotalFacturaAbonado
from Recibos
group by NumFactura
) R
on F.NumFactura = R.NumFactura
group by
Cliente

Esta y mi anterior propuesta funcionan como yo entiendo que
Diego quiere.
En tus propuestas estás asumiendo que la tabla Recibos
tiene un atributo Cliente. Pero según la información que
Diego ha dado, eso no es así.

Saludos,
Carlos
Respuesta Responder a este mensaje
#9 Diego Romero
19/11/2007 - 14:28 | Informe spam
Funcionó perfecto, esto es exactamente lo que necesitaba.

Muchas gracias por su valioso tiempo.


Diego M Romero

"Carlos M. Calvelo" escribió en el mensaje
news:
Hola Alejandro,

On 18 nov, 02:41, Alejandro Mesa
wrote:
Carlos M. Calvelo,

No exactamente, pero la condicion en la clausula "where"que utilice no es
la
correcta. En este caso se debe hacer la relacion por clientes.

select
Cliente,
SUM(ValorACargo) AS TotalFacturas,
(
select SUM(ValorAbonado)
from Recibos
where Recibos.Cliente = Facturas.Cliente
) AS TotalAbonado
from
Facturas
group by
Cliente
GO



Eso no va a funcionar. La tabla Recibos no tiene un atributo
Cliente. Tiene un atributo NumFactura y en Facturas está el cliente.



Tambien se pueden hacer dos tablas derivadas, que son la agrupacion por
cliente de facturas y de recibos.

select
coalesce(f.Cliente, r.Cliente) as Cliente,
f.sum_ValorACargo,
r.sum_ValorAbonado
from
(
select Cliente, SUM(ValorACargo) as sum_ValorACargo
from Facturas
group by Cliente
) as f
full outer join
(
select Cliente, SUM(ValorAbonado) as sum_ValorAbonado
from Recibos
group by Cliente
) as r
on f.Cliente = r.Cliente
GO




Lo mismo que arriba: La tabla Recibos no tiene un atributo Cliente.


Si existe una restriccion de integrida referencial desde Recibos hacia
Facturas, entonces se puede usar un LEFT OUTER JOIN con toda confianza.



Dada la extructura que presenta Diego (con comentario) creo que
podemos asumir eso; que NumFactura en Recibos es una referencia
a Facturas.

Con tablas derivadas yo lo hubiera hecho así:

select F.Cliente,
SUM(F.ValorACargo) as TotalFacturas,
SUM(R.TotalFacturaAbonado) as TotalAbonado
from Facturas F
left join
(
select NumFactura, SUM(ValorAbonado) as TotalFacturaAbonado
from Recibos
group by NumFactura
) R
on F.NumFactura = R.NumFactura
group by
Cliente

Esta y mi anterior propuesta funcionan como yo entiendo que
Diego quiere.
En tus propuestas estás asumiendo que la tabla Recibos
tiene un atributo Cliente. Pero según la información que
Diego ha dado, eso no es así.

Saludos,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida