رأيت مشكلة في csdn وفكرت فيها وكتبت واحدة. يرجى تصحيح لي إذا كنت مخطئا.
تتطلب وظيفة الشاشة تعريف جدول إحصائي للبيانات الموجودة في جدول (مع حذف الحقول غير المستخدمة)
LB01_PURRECEIVEBOOK
(
تاريخ الاستلام، --التنسيق: 2009/11/01
رقم الاستلام
)
① عند العد حسب السنة، إذا كان هناك سنة فارغة، فسيكون مبلغ تلك السنة 0
مثال:
2009/09/01 1000
2009/11/01 3000
2007/12/01 2000
يستخرج:
2009 4000
2008 0
2007 2000
②عند الحساب حسب الشهر، إذا كان هناك شهر فارغ، فسيتم تعيين مبلغ ذلك الشهر على 0
2009/09/01 1000
2009/11/01 3000
2009/12/01 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, 'yyyy')) AS NUM،
MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) AS MINYEAR
من LB01_PURRECEIVEBOOK T
)،
حدد_جدول AS (
حدد TMP.YEARSUM، TMP.YEAR، TMP.YMD
من (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE DESC) AS YEARSUM،
TO_CHAR(T.PURRECEIVEDATE، 'yyyy') AS YEAR،
TO_CHAR(T.PURRECEIVEDATE، 'yyyy/mm/dd') AS YMD،
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE) AS RN
من LB01_PURRECEIVEBOOK T) TMP
حيث TMP.RN = 1
)،
createyear_table AS (
حدد tmp_table.MINYEAR + LEVEL - 1 AS tmp_year من DUAL، tmp_table
الاتصال حسب المستوى <= tmp_table.NUM + 1
)
يختار
ct.tmp_year,
NVL(st.YEARSUM, 0) كـ YEARSUM
من
createyear_table ط م,
حدد_جدول ش
أين
ct.tmp_year = st.year(+)
مع tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) AS NUM،
MIN(TO_CHAR(T.PURRECEIVEDATE, 'yyyy')) AS MINYEAR
من LB01_PURRECEIVEBOOK T
)،
حدد_جدول AS (
حدد TMP.YEARSUM، TMP.YEAR، TMP.YMD
من (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE DESC) AS YEARSUM،
TO_CHAR(T.PURRECEIVEDATE، 'yyyy') AS YEAR،
TO_CHAR(T.PURRECEIVEDATE، 'yyyy/mm/dd') AS YMD،
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'yyyy') ORDER BY T.PURRECEIVEDATE) AS RN
من LB01_PURRECEIVEBOOK T) TMP
حيث TMP.RN = 1
)،
createyear_table AS (
حدد tmp_table.MINYEAR + LEVEL - 1 AS tmp_year من DUAL، tmp_table
الاتصال حسب المستوى <= tmp_table.NUM + 1
)
يختار
ct.tmp_year,
NVL(st.YEARSUM, 0) كـ YEARSUM
من
createyear_table ط م,
حدد_جدول ش
أين
ct.tmp_year = st.year(+)
الإحصائيات حسب الشهر
عرض نسخة عادية إلى الحافظة؟
مع tmp_table AS (SELECT MAX(TO_CHAR(T.PURRECEIVEDATE, 'mm')) -
MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) برقم NUM،
MIN(TO_CHAR(T.PURRECEIVEDATE, 'mm')) مثل MINMM،
MIN(TO_CHAR(T.PURRECEIVEDATE, 'YYYY')) AS MINY
من LB01_PURRECEIVEBOOK T
)،
حدد_جدول AS (
حدد TMP.MMSUM، TMP.MM، TMP.YMD
من (SELECT SUM(T.RECEIVEAMT) OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDER BY T.PURRECEIVEDATE DESC) كـ MMSUM،
TO_CHAR(T.PURRECEIVEDATE, 'MM') AS MM،
TO_CHAR(T.PURRECEIVEDATE، 'yyyy/mm/dd') AS YMD،
ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.PURRECEIVEDATE, 'MM') ORDER BY T.PURRECEIVEDATE) AS RN
من LB01_PURRECEIVEBOOK T) TMP
حيث TMP.RN = 1
)،
createyear_table AS (
حدد tmp_table.MINMM + LEVEL - 1 AS TMP_MM،
TO_CHAR(TO_DATE(MINY || tmp_table.MINMM + LEVEL - 1، 'YYYY-MM')، 'YYYY-MM') AS TMP_YM
من المزدوج، tmp_table
الاتصال حسب المستوى <= tmp_table.NUM + 1
)
يختار
ct.TMP_YM،
TO_CHAR(NVL(ST.MMSUM, 0), '9,999') AS MMSUM
من
createyear_table CT,
حدد_جدول ST
أين
CT.TMP_MM = ST.MM(+)
الطلب حسب
ct.TMP_YM
-