Vi un problema en csdn, lo pensé y escribí uno. Por favor corríjame si me equivoco.
La función de pantalla requiere la definición de una tabla estadística para los datos de una tabla (omitiendo los campos no utilizados)
LB01_PURRECEIVEBOOK
(
FECHA DE RECIBIMIENTO FECHA, --formato: 2009/11/01
NÚMERO DE RECIBIMIENTO
)
① Al contar por año, si hay un año en blanco, la cantidad para ese año será 0
ejemplo:
01/09/2009 1.000
01/11/2009 3.000
2007/12/01 2.000
Extracto:
2009 4.000
2008 0
2007 2.000
②Al calcular por mes, si hay un mes vacío, el monto de ese mes se establecerá en 0
01/09/2009 1.000
01/11/2009 3.000
01/12/2009 2.000
Extracto:
2009/09 1.000
2009/10 0
2009/11 3.000
2009/12 2.000
¿Se puede hacer esto de forma relativamente sencilla?
Según estadísticas anuales
¿Ver copia simple en el portapapeles?
CON tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) COMO NUM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) COMO MINYEAR
DE LB01_PURRECEIVEBOOK T
),
seleccionar_tabla AS (
SELECCIONE TMP.SUM DE AÑOS, TMP.AÑO, TMP.YMD
FROM (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDEN POR T.PURRECEIVEDATE DESC) COMO YEARSUM,
TO_CHAR(T.PURRECEIVEDATE, 'yyyy') COMO AÑO,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa/mm/dd') COMO YMD,
ROW_NUMBER() SOBRE(PARTICIÓN POR TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDEN POR T.PURRECEIVEDATE) COMO RN
DE LB01_PURRECEIVEBOOK T) TMP
DONDE TMP.RN = 1
),
creatyear_table AS (
SELECCIONE tmp_table.MINYEAR + NIVEL - 1 COMO tmp_year DE DUAL, tmp_table
CONECTAR POR NIVEL <= tmp_table.NUM + 1
)
SELECCIONAR
ct.tmp_año,
NVL(st.YEARSUM, 0) COMO AÑOSUM
DE
creatyear_table ct,
seleccionar_table st
DÓNDE
ct.tmp_año = st.año(+)
CON tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) COMO NUM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) COMO MINYEAR
DE LB01_PURRECEIVEBOOK T
),
seleccionar_tabla AS (
SELECCIONE TMP.SUM DE AÑOS, TMP.AÑO, TMP.YMD
FROM (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDEN POR T.PURRECEIVEDATE DESC) COMO YEARSUM,
TO_CHAR(T.PURRECEIVEDATE, 'yyyy') COMO AÑO,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa/mm/dd') COMO YMD,
ROW_NUMBER() SOBRE(PARTICIÓN POR TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDEN POR T.PURRECEIVEDATE) COMO RN
DE LB01_PURRECEIVEBOOK T) TMP
DONDE TMP.RN = 1
),
creatyear_table AS (
SELECCIONE tmp_table.MINYEAR + NIVEL - 1 COMO tmp_year DE DUAL, tmp_table
CONECTAR POR NIVEL <= tmp_table.NUM + 1
)
SELECCIONAR
ct.tmp_año,
NVL(st.YEARSUM, 0) COMO AÑOSUM
DE
creatyear_table ct,
seleccionar_table st
DÓNDE
ct.tmp_año = st.año(+)
Estadísticas por mes
¿Ver copia simple en el portapapeles?
CON tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'mm')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) COMO NUM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) COMO MINMM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'AAAA')) COMO MINY
DE LB01_PURRECEIVEBOOK T
),
seleccionar_tabla AS (
SELECCIONE TMP.MMSUM, TMP.MM, TMP.YMD
DESDE (SELECCIONE SUMA(T.RECEIVEAMT) SOBRE(PARTICIÓN POR TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDEN POR T.PURRECEIVEDATE DESC) COMO MMSUM,
TO_CHAR(T.PURRECEIVEDATE, 'MM') COMO MM,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa/mm/dd') COMO YMD,
ROW_NUMBER() SOBRE(PARTICIÓN POR TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDEN POR T.PURRECEIVEDATE) COMO RN
DE LB01_PURRECEIVEBOOK T) TMP
DONDE TMP.RN = 1
),
creatyear_table AS (
SELECCIONE tmp_table.MINMM + NIVEL - 1 COMO TMP_MM,
TO_CHAR(TO_DATE(MINY || tmp_table.MINMM + NIVEL - 1, 'AAAA-MM'), 'AAAA-MM') AS TMP_YM
DESDE DUAL, tmp_table
CONECTAR POR NIVEL <= tmp_table.NUM + 1
)
SELECCIONAR
ct.TMP_YM,
TO_CHAR(NVL(ST.MMSUM, 0), '9,999') COMO MMSUM
DE
creatyear_table CT,
seleccionar_tabla ST
DÓNDE
CT.TMP_MM = ST.MM(+)
ORDEN POR
ct.TMP_YM
-