consulta cruzada con sum
Publicado por Celine (1 intervención) el 24/07/2007 18:16:52
tenemos 3 tablas con los siguientes campos:
divisa = id
compra = id,divisa,cantidad,establecimiento,fecha
venta = id,divisa,cantidad,establecimiento,fecha
cantidad es decimal
establecimiento es 'S' o 'N'
queremos la una tabla con las siguientes columnas:
divisa.id
sum(compra.cantidad) y establecimiento='N' (cc)
sum(compra.cantidad) y establecimiento='S' (ce)
sum(venta.cantidad) y establecimiento='N' (vc)
sum(venta.cantidad) y establecimiento='S' (ve)
he probado muchos querys, y el que más se acerca es:
SELECT distinct T1.ID,T2.CC,t3.ce,t4.vc,t5.ve
from
(SELECT distinct DIVISA.id
from divisa,compra,venta
where (divisa.id=compra.divisa and compra.fecha between '2007-07-01' AND '2007-10-01')
or (divisa.id=venta.divisa and venta.fecha between '2007-07-01' AND '2007-10-01'))
T1,
(SELECT distinct DIVISA.id,sum(cast(COMPRA.CANTIDAD as decimal(15,4))) as cc
from (DIVISA RIGHT JOIN COMPRA ON ((divisa.id=COMPRA.DIVISA)and (COMPRA.FECHA BETWEEN '2007-07-01' AND '2007-10-01')))
where COMPRA.ESTABLECIMIENTO='N' group by divisa.id)
t2,
(SELECT distinct DIVISA.id,sum(cast(compra.CANTIDAD as decimal(15,4))) as ce
from (DIVISA RIGHT JOIN COMPRA ON divisa.id=COMPRA.DIVISA)
where COMPRA.ESTABLECIMIENTO='S' AND COMPRA.FECHA BETWEEN '2007-07-01' AND '2007-10-01'
group by divisa.id)
t3,
(SELECT distinct DIVISA.id,sum(cast(venta.CANTIDAD as decimal(15,4))) as vc
from (DIVISA RIGHT JOIN venta ON divisa.id=venta.DIVISA)
where venta.ESTABLECIMIENTO='N' AND venta.FECHA BETWEEN '2007-07-01' AND '2007-10-01'
group by divisa.id)
t4,
(SELECT distinct DIVISA.id,sum(cast(venta.CANTIDAD as decimal(15,4))) as ve
from (DIVISA RIGHT JOIN venta ON divisa.id=venta.DIVISA)
where venta.ESTABLECIMIENTO='S' AND venta.FECHA BETWEEN '2007-07-01' AND '2007-10-01'
group by divisa.id)
t5
where (t1.id=t2.id and t1.id=t3.id) and (t1.id=t4.id and t1.id=t5.id)
group by t1.id,t2.cc,t3.ce,t4.vc,t5.ve
pero como existe solo una venta a cliente para una de la divisas y no para la otra, no se muestran todas las divisas
para las que hay compras o ventas en una fecha, el resultado es:
divisa.id cc ce vc ve
1 13333.00 4444.00 35000.00 12777.00
Cuando debería ser:
divisa.id cc ce vc ve
1 13333.00 4444.00 35000.00 12777.00
4 3790.00 1000.00 00.00 2500.00
La última tabla se hace con java si alguien puede explicarme como pasar un tableModel al jasperReports también me valdría.
divisa = id
compra = id,divisa,cantidad,establecimiento,fecha
venta = id,divisa,cantidad,establecimiento,fecha
cantidad es decimal
establecimiento es 'S' o 'N'
queremos la una tabla con las siguientes columnas:
divisa.id
sum(compra.cantidad) y establecimiento='N' (cc)
sum(compra.cantidad) y establecimiento='S' (ce)
sum(venta.cantidad) y establecimiento='N' (vc)
sum(venta.cantidad) y establecimiento='S' (ve)
he probado muchos querys, y el que más se acerca es:
SELECT distinct T1.ID,T2.CC,t3.ce,t4.vc,t5.ve
from
(SELECT distinct DIVISA.id
from divisa,compra,venta
where (divisa.id=compra.divisa and compra.fecha between '2007-07-01' AND '2007-10-01')
or (divisa.id=venta.divisa and venta.fecha between '2007-07-01' AND '2007-10-01'))
T1,
(SELECT distinct DIVISA.id,sum(cast(COMPRA.CANTIDAD as decimal(15,4))) as cc
from (DIVISA RIGHT JOIN COMPRA ON ((divisa.id=COMPRA.DIVISA)and (COMPRA.FECHA BETWEEN '2007-07-01' AND '2007-10-01')))
where COMPRA.ESTABLECIMIENTO='N' group by divisa.id)
t2,
(SELECT distinct DIVISA.id,sum(cast(compra.CANTIDAD as decimal(15,4))) as ce
from (DIVISA RIGHT JOIN COMPRA ON divisa.id=COMPRA.DIVISA)
where COMPRA.ESTABLECIMIENTO='S' AND COMPRA.FECHA BETWEEN '2007-07-01' AND '2007-10-01'
group by divisa.id)
t3,
(SELECT distinct DIVISA.id,sum(cast(venta.CANTIDAD as decimal(15,4))) as vc
from (DIVISA RIGHT JOIN venta ON divisa.id=venta.DIVISA)
where venta.ESTABLECIMIENTO='N' AND venta.FECHA BETWEEN '2007-07-01' AND '2007-10-01'
group by divisa.id)
t4,
(SELECT distinct DIVISA.id,sum(cast(venta.CANTIDAD as decimal(15,4))) as ve
from (DIVISA RIGHT JOIN venta ON divisa.id=venta.DIVISA)
where venta.ESTABLECIMIENTO='S' AND venta.FECHA BETWEEN '2007-07-01' AND '2007-10-01'
group by divisa.id)
t5
where (t1.id=t2.id and t1.id=t3.id) and (t1.id=t4.id and t1.id=t5.id)
group by t1.id,t2.cc,t3.ce,t4.vc,t5.ve
pero como existe solo una venta a cliente para una de la divisas y no para la otra, no se muestran todas las divisas
para las que hay compras o ventas en una fecha, el resultado es:
divisa.id cc ce vc ve
1 13333.00 4444.00 35000.00 12777.00
Cuando debería ser:
divisa.id cc ce vc ve
1 13333.00 4444.00 35000.00 12777.00
4 3790.00 1000.00 00.00 2500.00
La última tabla se hace con java si alguien puede explicarme como pasar un tableModel al jasperReports también me valdría.
Valora esta pregunta


0