Eu vi um problema no csdn, pensei sobre isso e escrevi um. Por favor, corrija-me se eu estiver errado.
A função de tela requer definição de tabela estatística para dados em uma tabela (omitindo campos não utilizados)
LB01_PURRECEIVEBOOK
(
PURRECEIVEDATE DATA, --formato: 2009/11/01
NÚMERO DE RECEBIMENTO
)
① Na contagem por ano, se houver um ano em branco, o valor desse ano será 0
exemplo:
01/09/2009 1.000
01/11/2009 3.000
01/12/2007 2.000
Extrair:
2009 4.000
2008 0
2007 2.000
②Ao calcular por mês, se houver um mês vazio, o valor desse mês será definido como 0
01/09/2009 1.000
01/11/2009 3.000
01/12/2009 2.000
Extrair:
2009/09 1.000
2009/10 0
2009/11 3.000
2009/12 2.000
Isso pode ser feito de forma relativamente simples?
De acordo com estatísticas anuais
visualizar cópia simples para impressão da área de transferência?
COM tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) AS NUM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) AS MINYEAR
DE LB01_PURRECEIVEBOOK T
),
select_table AS (
SELECIONE TMP.YEARSUM, TMP.YEAR, TMP.YMD
FROM (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE DESC) AS YEARSUM,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa') COMO ANO,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa/mm/dd') AS YMD,
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE) AS RN
DE LB01_PURRECEIVEBOOK T) TMP
ONDE TMP.RN = 1
),
createyear_table AS (
SELECIONE tmp_table.MINYEAR + LEVEL - 1 AS tmp_year FROM DUAL, tmp_table
CONECTAR POR NÍVEL <= tmp_table.NUM + 1
)
SELECIONAR
ct.tmp_ano,
NVL(st.YEARSUM, 0) COMO YEARSUM
DE
createyear_table ct,
select_table st
ONDE
ct.tmp_ano = ano st.(+)
COM tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) AS NUM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'aaaa')) AS MINYEAR
DE LB01_PURRECEIVEBOOK T
),
select_table AS (
SELECIONE TMP.YEARSUM, TMP.YEAR, TMP.YMD
FROM (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE DESC) AS YEARSUM,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa') COMO ANO,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa/mm/dd') AS YMD,
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE) AS RN
DE LB01_PURRECEIVEBOOK T) TMP
ONDE TMP.RN = 1
),
createyear_table AS (
SELECIONE tmp_table.MINYEAR + LEVEL - 1 AS tmp_year FROM DUAL, tmp_table
CONECTAR POR NÍVEL <= tmp_table.NUM + 1
)
SELECIONAR
ct.tmp_ano,
NVL(st.YEARSUM, 0) COMO YEARSUM
DE
createyear_table ct,
select_table st
ONDE
ct.tmp_ano = ano st.(+)
Estatísticas por mês
visualizar cópia simples para impressão da área de transferência?
COM tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'mm')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) AS NUM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) AS MINMM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'AAAA')) AS MINY
DE LB01_PURRECEIVEBOOK T
),
select_table AS (
SELECIONE TMP.MMSUM, TMP.MM, TMP.YMD
FROM (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDER BY T.PURRECEIVEDATE DESC) AS MMSUM,
TO_CHAR(T.PURRECEIVEDATE, 'MM') AS MM,
TO_CHAR(T.PURRECEIVEDATE, 'aaaa/mm/dd') AS YMD,
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDER BY T.PURRECEIVEDATE) AS RN
DE LB01_PURRECEIVEBOOK T) TMP
ONDE TMP.RN = 1
),
createyear_table AS (
SELECIONE tmp_table.MINMM + LEVEL - 1 COMO TMP_MM,
TO_CHAR(TO_DATE(MINY || tmp_table.MINMM + LEVEL - 1, 'AAAA-MM'), 'AAAA-MM') AS TMP_YM
DE DUAL, tmp_table
CONECTAR POR NÍVEL <= tmp_table.NUM + 1
)
SELECIONAR
ct.TMP_YM,
TO_CHAR(NVL(ST.MMSUM, 0), '9.999') AS MMSUM
DE
createyear_table CT,
select_table ST
ONDE
CT.TMP_MM = ST.MM(+)
ENCOMENDAR POR
ct.TMP_YM
-