Я увидел проблему на csdn, подумал об этом и написал ее. Пожалуйста, поправьте меня, если я ошибаюсь.
Функция экрана требует определения статистической таблицы для данных в таблице (без неиспользуемых полей).
LB01_PURRECEIVEBOOK
(
ДАТА ПОЛУЧЕНИЯ, --формат: 2009/11/01
НОМЕР ПОЛУЧЕНИЯ
)
① При подсчете по годам, если есть пустой год, сумма за этот год будет равна 0.
пример:
01.09.2009 1000
11.11.2009 3000
1 декабря 2007 г. 2000
Извлекать:
2009 4000
2008 0
2007 2000
②При расчете по месяцам, если есть пустой месяц, сумма этого месяца будет установлена на 0.
01.09.2009 1000
11.11.2009 3000
01.12.2009 2000
Извлекать:
2009/09 1000
2009/10 0
2009/11 3000
2009/12 2000
Можно ли это сделать относительно просто?
По годовой статистике
просмотреть обычную копию в буфер обмена, распечатать?
С tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'гггг')) КАК ЧИСЛО,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'гггг')) КАК MINYEAR
ИЗ LB01_PURRECEIVEBOOK T
),
выберите_таблицу AS (
ВЫБЕРИТЕ 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, 'гггг') КАК ГОД,
TO_CHAR(T.PURRECEIVEDATE, 'гггг/мм/дд') AS YMD,
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE) AS RN
ИЗ LB01_PURRECEIVEBOOK T) TMP
ГДЕ ТМП.РН = 1
),
createyear_table AS (
ВЫБЕРИТЕ tmp_table.MINYEAR + LEVEL - 1 КАК tmp_year FROM DUAL, tmp_table
ПОДКЛЮЧИТЬ ПО УРОВНЮ <= tmp_table.NUM + 1
)
ВЫБИРАТЬ
ct.tmp_year,
NVL(st.YEARSUM, 0) КАК СУММА ГОДОВ
ОТ
createyear_table ct,
select_table ул
ГДЕ
ct.tmp_year = st.year(+)
С tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'гггг')) КАК ЧИСЛО,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'гггг')) КАК MINYEAR
ИЗ LB01_PURRECEIVEBOOK T
),
выберите_таблицу AS (
ВЫБЕРИТЕ 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, 'гггг') КАК ГОД,
TO_CHAR(T.PURRECEIVEDATE, 'гггг/мм/дд') AS YMD,
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE) AS RN
ИЗ LB01_PURRECEIVEBOOK T) TMP
ГДЕ ТМП.РН = 1
),
createyear_table AS (
ВЫБЕРИТЕ tmp_table.MINYEAR + LEVEL - 1 КАК tmp_year FROM DUAL, tmp_table
ПОДКЛЮЧИТЬ ПО УРОВНЮ <= tmp_table.NUM + 1
)
ВЫБИРАТЬ
ct.tmp_year,
NVL(st.YEARSUM, 0) КАК СУММА ГОДОВ
ОТ
createyear_table ct,
select_table ул
ГДЕ
ct.tmp_year = st.year(+)
Статистика по месяцам
просмотреть обычную копию в буфер обмена, распечатать?
С tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'мм')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'мм')) КАК ЧИСЛО,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'мм')) КАК MINMM,
MIN(TO_CHAR(T.PURRECEIVEDATE, 'ГГГГ')) КАК MINY
ИЗ LB01_PURRECEIVEBOOK T
),
выберите_таблицу AS (
ВЫБЕРИТЕ 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, 'ММ') КАК ММ,
TO_CHAR(T.PURRECEIVEDATE, 'гггг/мм/дд') AS YMD,
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDER BY T.PURRECEIVEDATE) AS RN
ИЗ LB01_PURRECEIVEBOOK T) TMP
ГДЕ ТМП.РН = 1
),
createyear_table AS (
ВЫБЕРИТЕ tmp_table.MINMM + УРОВЕНЬ - 1 КАК TMP_MM,
TO_CHAR(TO_DATE(MINY || tmp_table.MINMM + УРОВЕНЬ - 1, 'ГГГГ-ММ'), 'ГГГГ-ММ') КАК TMP_YM
ИЗ ДВОЙНОГО, tmp_table
ПОДКЛЮЧИТЬ ПО УРОВНЮ <= tmp_table.NUM + 1
)
ВЫБИРАТЬ
ct.TMP_YM,
TO_CHAR(NVL(ST.MMSUM, 0), '9999') КАК MMSUM
ОТ
createyear_table CT,
select_table ST
ГДЕ
CT.TMP_MM = СТ.ММ(+)
ЗАКАЗАТЬ ПО
ct.TMP_YM
-