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

#1 Salvador Ramos
17/11/2007 - 19:10 | Informe spam
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
#2 Alejandro Mesa
17/11/2007 - 20:43 | Informe spam
Diego Romero,

Estas en lo correcto, por eso es que no debes usar un JOIN, sino que en este
caso sera mejor un query correlacionado.

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


AMB

"Diego Romero" wrote:

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
#3 Carlos M. Calvelo
17/11/2007 - 21:15 | Informe spam
Hola Alejandro,

On 17 nov, 20:43, Alejandro Mesa
wrote:
Diego Romero,

Estas en lo correcto, por eso es que no debes usar un JOIN, sino que en este
caso sera mejor un query correlacionado.

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



Seguro que es esto lo que quieres decir:

select
Cliente,
SUM(ValorACargo) AS TotalFacturas,
(
select SUM(ValorAbonado)
from Facturas inner join Recibos
on Facturas.NumFactura = Recibos.NumFactura
where Facturas.cliente = F.Cliente
) AS TotalAbonado
from
Facturas F
group by
Cliente

Saludos,
Carlos
Respuesta Responder a este mensaje
#4 Alejandro Mesa
18/11/2007 - 02:41 | Informe spam
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

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

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

Gracias por el comentario,
AMB

"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 17 nov, 20:43, Alejandro Mesa
wrote:
> Diego Romero,
>
> Estas en lo correcto, por eso es que no debes usar un JOIN, sino que en este
> caso sera mejor un query correlacionado.
>
> select
> Cliente,
> SUM(ValorACargo) AS TotalFacturas,
> (
> select SUM(ValorAbonado)
> from Recibos
> where Recibos.NumFactura = Facturas.NumFactura
> ) AS TotalAbonado
> from
> Facturas
> group by
> Cliente

Seguro que es esto lo que quieres decir:

select
Cliente,
SUM(ValorACargo) AS TotalFacturas,
(
select SUM(ValorAbonado)
from Facturas inner join Recibos
on Facturas.NumFactura = Recibos.NumFactura
where Facturas.cliente = F.Cliente
) AS TotalAbonado
from
Facturas F
group by
Cliente

Saludos,
Carlos

Respuesta Responder a este mensaje
#5 Carlos M. Calvelo
18/11/2007 - 12:16 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida