Usa las tablas detall_asto, cuentas y t_ctas que son los detalles de los asientos , las cuentas y los tipos de cuenta respectivamente.
En la versión para Mysql no se necesitan usar funciones almacenadas para la condicion dentro del select, se puede usar directamente SELECT IF(1=1,'VERDAD','MENTIRA'); pero se podrían usar:
select c.descrip ,tc.id_t_cta,
sum(da.debe) Debitos,
sum(da.haber) Creditos,
IF((sum(da.debe)-sum(da.haber))<0,'',(sum(da.debe)-sum(da.haber))) saldo_deudor,
IF((sum(da.haber)-sum(da.debe))<0,'',(sum(da.haber)-sum(da.debe))) saldo_acreedor,
IF(((sum(da.debe)-sum(da.haber))<0) or tc.id_t_cta>2,'',(sum(da.debe)-sum(da.haber))) Inv_Activo ,
IF(((sum(da.debe)-sum(da.haber))>0) or tc.id_t_cta>2,'',abs(sum(da.debe)-sum(da.haber))) Inv_Pasivo ,
IF(((sum(da.debe)-sum(da.haber))<0) or tc.id_t_cta<3,'',(sum(da.debe)-sum(da.haber))) Perdidas,
IF(((sum(da.debe)-sum(da.haber))>0) or tc.id_t_cta<3,'',abs(sum(da.debe)-sum(da.haber))) Ganancias ,
(select sum(debe) from detall_asto) tdebe,
(select sum(haber) from detall_asto) thaber
from detall_asto da, cuentas c,t_ctas tc
where da.id_cta = c.id_cta and tc.id_t_cta = c.id_t_cta
group by da.id_cta
order by c.id_t_cta, c.descrip
Y en la versión para Oracle podemos usar CASE o crear unas funciones para reemplazar las condiciones
CREATE OR REPLACE function CNOBLE.F_GET_RES
(v_in_debe NUMBER,v_in_haber NUMBER,v_in_tc NUMBER)
return NUMBER
is
v_out_nr NUMBER:=NULL;
begin
if v_in_debe-v_in_haber>0 AND v_in_tc>2
then
v_out_nr:=v_in_debe-v_in_haber;
end if;
return v_out_nr;
end;
Y hacemos la consulta.
select tc.id_t_cta,c.descrip,
sum(da.debe) Debitos,
sum(da.haber) Creditos,
f_get_saldos(NVL(sum(da.debe),0),NVL(sum(da.haber),0)) saldos_deudor,
etc...
Más adelante veremos la version con CASE de Oracle.
No hay comentarios:
Publicar un comentario