//CREATE or replace VIEW CN_BALANCE_DETALLADO_CATALOGO AS 
SELECT
bal.ID_CLASE_CUENTA,
bal.ID_GRUPO_CUENTA,
bal.ID_CUENTA_MAYOR,
bal.ID_CATALOGO,
bal.CUENTA,
bal.AUXILIAR,
bal.SUBAUXILIAR,
bal.TERCERO,
bal.NOMBRE_CUENTA,
bal.SALDO_ANTERIOR,
bal.MVTO_DEBITO,
bal.MVTO_CREDITO,
bal.NUEVO_SALDO,
 /**Llave de la vista*/
bal.ID_CIA,
bal.ID_CEN_OP,
bal.ID_VIGENCIA,
bal.ID_PERIODO_CONTABLE
FROM
(
/** INICIA BALANCE */
/* Clase Cuenta*/
SELECT *
FROM
(
SELECT
ID_CLASE_CUENTA,
NULL AS ID_GRUPO_CUENTA,
NULL AS ID_CUENTA_MAYOR,
NULL AS ID_CATALOGO,
CUENTA,
NULL AS AUXILIAR,
NULL AS SUBAUXILIAR,
NULL AS TERCERO,
NOMBRE_CUENTA,
SUM(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
SUM(MVTO_DEBITO) AS MVTO_DEBITO,
SUM(MVTO_CREDITO) AS MVTO_CREDITO,
SUM(NUEVO_SALDO) AS NUEVO_SALDO,
 /**Llave de la vista*/
 ID_CIA,
 ID_CEN_OP,
 ID_VIGENCIA,
 ID_PERIODO_CONTABLE
FROM 
(
SELECT
sal.ID_CLASE_CUENTA,
SUBSTR(sal.SUBCUENTA,1,1) AS CUENTA,
cla.NOMBRE AS NOMBRE_CUENTA,
CASE cue.NATURALEZA
 WHEN cla.NATURALEZA THEN sal.SALDO_ANTERIOR
 ELSE -sal.SALDO_ANTERIOR
END AS SALDO_ANTERIOR,
sal.DEBITO AS MVTO_DEBITO,
sal.CREDITO AS MVTO_CREDITO,
CASE cue.NATURALEZA
 WHEN cla.NATURALEZA THEN sal.SALDO_ACTUAL
 ELSE -sal.SALDO_ACTUAL
END AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
FROM
 CN_SALDO sal

JOIN CN_CUENTA_MAYOR cue ON
 sal.ID_CIA = cue.ID_CIA
 AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

JOIN CN_CLASE_CUENTA cla ON
 sal.ID_CIA = cla.ID_CIA
 AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
)
GROUP BY
ID_CLASE_CUENTA,
CUENTA,
NOMBRE_CUENTA,
 /**Llave de la vista*/
 ID_CIA,
 ID_CEN_OP,
 ID_VIGENCIA,
 ID_PERIODO_CONTABLE
)

UNION

/* Grupo Cuenta*/
SELECT *
FROM
(
SELECT
ID_CLASE_CUENTA,
ID_GRUPO_CUENTA,
NULL AS ID_CUENTA_MAYOR,
NULL AS ID_CATALOGO,
CUENTA,
NULL AS AUXILIAR,
NULL AS SUBAUXILIAR,
NULL AS TERCERO,
NOMBRE_CUENTA,
SUM(SALDO_ANTERIOR) AS SALDO_ANTERIOR,
SUM(MVTO_DEBITO) AS MVTO_DEBITO,
SUM(MVTO_CREDITO) AS MVTO_CREDITO,
SUM(NUEVO_SALDO) AS NUEVO_SALDO,
 /**Llave de la vista*/
 ID_CIA,
 ID_CEN_OP,
 ID_VIGENCIA,
 ID_PERIODO_CONTABLE
FROM 
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
SUBSTR(sal.SUBCUENTA,1,2) AS CUENTA,
gru.NOMBRE AS NOMBRE_CUENTA,
CASE cue.NATURALEZA
 WHEN cla.NATURALEZA THEN sal.SALDO_ANTERIOR
 ELSE -sal.SALDO_ANTERIOR
END AS SALDO_ANTERIOR,
sal.DEBITO AS MVTO_DEBITO,
sal.CREDITO AS MVTO_CREDITO,
CASE cue.NATURALEZA
 WHEN cla.NATURALEZA THEN sal.SALDO_ACTUAL
 ELSE -sal.SALDO_ACTUAL
END AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN CN_CUENTA_MAYOR cue ON
 sal.ID_CIA = cue.ID_CIA
 AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

JOIN CN_GRUPO_CUENTA gru ON
 sal.ID_CIA = gru.ID_CIA
 AND sal.ID_GRUPO_CUENTA = gru.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = gru.ID_CLASE_CUENTA

JOIN CN_CLASE_CUENTA cla ON
 sal.ID_CIA = cla.ID_CIA
 AND sal.ID_CLASE_CUENTA = cla.ID_CLASE_CUENTA
)
GROUP BY
ID_CLASE_CUENTA,
ID_GRUPO_CUENTA,
CUENTA,
NOMBRE_CUENTA,
 /**Llave de la vista*/
 ID_CIA,
 ID_CEN_OP,
 ID_VIGENCIA,
 ID_PERIODO_CONTABLE
)

UNION

/* Cuenta Mayor*/
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
NULL AS ID_CATALOGO,
SUBSTR(sal.SUBCUENTA,1,4) AS CUENTA,
NULL AS AUXILIAR,
NULL AS SUBAUXILIAR,
NULL AS TERCERO,
cue.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN CN_CUENTA_MAYOR cue ON
 sal.ID_CIA = cue.ID_CIA
 AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
 SUBSTR(sal.SUBCUENTA,1,4),
 cue.NOMBRE,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)

UNION

/* Subcuenta con terceros */
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
sal.SUBCUENTA AS CUENTA,
NULL AS AUXILIAR,
NULL AS SUBAUXILIAR,
ter.NITOCC AS TERCERO,
ter.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN CN_CATALOGO cat ON
 sal.ID_CIA = cat.ID_CIA
 AND sal.ID_CATALOGO = cat.ID_CATALOGO
 AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA

JOIN CN_MAE_TER ter ON
 sal.ID_CIA = ter.ID_CIA
 AND sal.ID_MAE_TER = ter.ID_MAE_TER

GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
 sal.SUBCUENTA,
 ter.NITOCC,
 ter.NOMBRE,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)

UNION

/* Subcuenta sin terceros */
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
sal.SUBCUENTA AS CUENTA,
NULL AS AUXILIAR,
NULL AS SUBAUXILIAR,
NULL AS TERCERO,
cat.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN CN_CATALOGO cat ON
 sal.ID_CIA = cat.ID_CIA
 AND sal.ID_CATALOGO = cat.ID_CATALOGO
 AND sal.ID_CUENTA_MAYOR = cat.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = cat.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = cat.ID_CLASE_CUENTA

GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
 sal.SUBCUENTA,
 cat.NOMBRE,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)

UNION

/* Auxiliares con terceros*/
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
sal.SUBCUENTA AS CUENTA,
aux.COD_AUX AS AUXILIAR,
NULL AS SUBAUXILIAR,
ter.NITOCC AS TERCERO,
ter.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN
 CN_AUXILIAR aux
 ON sal.ID_CIA = aux.ID_CIA
 AND sal.ID_AUXILIAR = aux.ID_AUXILIAR
 AND sal.ID_CATALOGO = aux.ID_CATALOGO
 AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA

JOIN CN_MAE_TER ter ON
 sal.ID_CIA = ter.ID_CIA
 AND sal.ID_MAE_TER = ter.ID_MAE_TER

GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
 sal.SUBCUENTA,
 aux.COD_AUX,
 ter.NOMBRE,
 ter.NITOCC,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)

UNION


/* Auxiliares sin terceros*/
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
sal.SUBCUENTA AS CUENTA,
aux.COD_AUX AS AUXILIAR,
NULL AS SUBAUXILIAR,
NULL AS TERCERO,
aux.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN
 CN_AUXILIAR aux
 ON sal.ID_CIA = aux.ID_CIA
 AND sal.ID_AUXILIAR = aux.ID_AUXILIAR
 AND sal.ID_CATALOGO = aux.ID_CATALOGO
 AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA

GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
 sal.SUBCUENTA,
 aux.COD_AUX,
 aux.NOMBRE,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)

UNION

/* Sub auxiliares con terceros*/
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
sal.SUBCUENTA AS CUENTA,
aux.COD_AUX AS AUXILIAR,
subaux.COD_SUB_AUX AS SUBAUXILIAR,
ter.NITOCC AS TERCERO,
ter.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN
 CN_AUXILIAR aux
 ON sal.ID_CIA = aux.ID_CIA
 AND sal.ID_AUXILIAR = aux.ID_AUXILIAR
 AND sal.ID_CATALOGO = aux.ID_CATALOGO
 AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA

JOIN
 CN_SUB_AUX subaux
 ON sal.ID_CIA = subaux.ID_CIA
 AND sal.ID_SUB_AUX = subaux.ID_SUB_AUX
 AND aux.ID_TIPO_SUB_AUX = subaux.ID_TIPO_SUB_AUX

JOIN CN_MAE_TER ter ON
 sal.ID_CIA = ter.ID_CIA
 AND sal.ID_MAE_TER = ter.ID_MAE_TER
 
GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
 sal.SUBCUENTA,
 aux.COD_AUX,
 subaux.COD_SUB_AUX,
 ter.NITOCC,
 ter.NOMBRE,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)

UNION

/* Sub auxiliares sin terceros*/
SELECT *
FROM
(
SELECT
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
sal.SUBCUENTA AS CUENTA,
aux.COD_AUX AS AUXILIAR,
subaux.COD_SUB_AUX AS SUBAUXILIAR,
NULL AS TERCERO,
subaux.NOMBRE AS NOMBRE_CUENTA,
sum(sal.SALDO_ANTERIOR) AS SALDO_ANTERIOR,
sum(sal.DEBITO) AS MVTO_DEBITO,
sum(sal.CREDITO) AS MVTO_CREDITO,
sum(sal.SALDO_ACTUAL) AS NUEVO_SALDO,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE

FROM
 CN_SALDO sal

JOIN
 CN_AUXILIAR aux
 ON sal.ID_CIA = aux.ID_CIA
 AND sal.ID_AUXILIAR = aux.ID_AUXILIAR
 AND sal.ID_CATALOGO = aux.ID_CATALOGO
 AND sal.ID_CUENTA_MAYOR = aux.ID_CUENTA_MAYOR
 AND sal.ID_GRUPO_CUENTA = aux.ID_GRUPO_CUENTA
 AND sal.ID_CLASE_CUENTA = aux.ID_CLASE_CUENTA

JOIN
 CN_SUB_AUX subaux
 ON sal.ID_CIA = subaux.ID_CIA
 AND sal.ID_SUB_AUX = subaux.ID_SUB_AUX
 AND aux.ID_TIPO_SUB_AUX = subaux.ID_TIPO_SUB_AUX
 
GROUP BY
sal.ID_CLASE_CUENTA,
sal.ID_GRUPO_CUENTA,
sal.ID_CUENTA_MAYOR,
sal.ID_CATALOGO,
 sal.SUBCUENTA,
 aux.COD_AUX,
 subaux.COD_SUB_AUX,
 subaux.NOMBRE,
 /**Llave de la vista*/
 sal.ID_CIA,
 sal.ID_CEN_OP,
 sal.ID_VIGENCIA,
 sal.ID_PERIODO_CONTABLE
)
/** TERMINA BALANCE **/
)
bal
ORDER BY
bal.CUENTA ASC,
NVL(bal.AUXILIAR,'000') ASC,
NVL(bal.SUBAUXILIAR,'000') ASC,
NVL(bal.TERCERO,'00000000000000000000000000000000') ASC