我想获得两个日期之间的每月计数。例如,让我们采用以下范围:
20181202-20190202
此范围将为+1(2018年)和“ 1月”,“ 2月”(2019年)的计数提供+1。
目前,我按月和年进行汇总以获取这些计数,但是我忘记了日期之间相隔1年以上的情况。
查询现在看起来像这样:
CREATE VIEW V_A_A AS
SELECT CASE WHEN 01>=JT.SUBSTR(START,5,2) AND 01<=JT.SUBSTR(ENDID,1,4) THEN 'JAN'
WHEN 02>=JT.SUBSTR(START,5,2) AND 02<=JT.SUBSTR(ENDID,5,2) THEN 'FEB'
WHEN 03>=JT.SUBSTR(START,5,2) AND 03<=JT.SUBSTR(ENDID,5,2) THEN 'MAR'
WHEN 04>=JT.SUBSTR(START,5,2) AND 04<=JT.SUBSTR(ENDID,5,2) THEN 'APR'
WHEN 05>=JT.SUBSTR(START,5,2) AND 05<=JT.SUBSTR(ENDID,5,2) THEN 'MAY'
WHEN 06>=JT.SUBSTR(START,5,2) AND 06<=JT.SUBSTR(ENDID,5,2) THEN 'JUNE'
WHEN 07>=JT.SUBSTR(START,5,2) AND 07<=JT.SUBSTR(ENDID,5,2) THEN 'JULY'
WHEN 08>=JT.SUBSTR(START,5,2) AND 08<=JT.SUBSTR(ENDID,5,2) THEN 'AUG'
WHEN 09>=JT.SUBSTR(START,5,2) AND 09<=JT.SUBSTR(ENDID,5,2) THEN 'SEPT'
WHEN 10>=JT.SUBSTR(START,5,2) AND 10<=JT.SUBSTR(ENDID,5,2) THEN 'OCT'
WHEN 11>=JT.SUBSTR(START,5,2) AND 11<=JT.SUBSTR(ENDID,5,2) THEN 'NOV'
WHEN 12>=JT.SUBSTR(START,5,2) AND 12<=JT.SUBSTR(ENDID,5,2) THEN 'DEC' ELSE 'N/A' END MONTH
,CASE WHEN 2019>=JT.SUBSTR(START,1,4) AND 2019<=JT.SUBSTR(ENDID,1,4) THEN 2019
WHEN 2018>=JT.SUBSTR(START,1,4) AND 2018<=JT.SUBSTR(ENDID,1,4) THEN 2018
WHEN 2017>=JT.SUBSTR(START,1,4) AND 2017<=JT.SUBSTR(ENDID,1,4) THEN 2017
WHEN 2016>=JT.SUBSTR(START,1,4) AND 2016<=JT.SUBSTR(ENDID,1,4) THEN 2016
WHEN 2015>=JT.SUBSTR(START,1,4) AND 2015<=JT.SUBSTR(ENDID,1,4) THEN 2015 ELSE 0 END YEAR
,COUNT(*) AS COUNT
from
(select * from some_db a
INNER JOIN another_db b ON a.field = b.field
WHERE a.name = "Private" JT
GROUP BY CASE WHEN 2019>=JT.SUBSTR(START,1,4) AND 2019<=JT.SUBSTR(ENDID,1,4) THEN 2019
WHEN 2018>=JT.SUBSTR(START,1,4) AND 2018<=JT.SUBSTR(ENDID,1,4) THEN 2018
WHEN 2017>=JT.SUBSTR(START,1,4) AND 2017<=JT.SUBSTR(ENDID,1,4) THEN 2017
WHEN 2016>=JT.SUBSTR(START,1,4) AND 2016<=JT.SUBSTR(ENDID,1,4) THEN 2016
WHEN 2015>=JT.SUBSTR(START,1,4) AND 2015<=JT.SUBSTR(ENDID,1,4) THEN 2015 ELSE 0 END,
CASE WHEN 01>=JT.SUBSTR(START,5,2) AND 01<=JT.SUBSTR(ENDID,1,4) THEN 'JAN'
WHEN 02>=JT.SUBSTR(START,5,2) AND 02<=JT.SUBSTR(ENDID,5,2) THEN 'FEB'
WHEN 03>=JT.SUBSTR(START,5,2) AND 03<=JT.SUBSTR(ENDID,5,2) THEN 'MAR'
WHEN 04>=JT.SUBSTR(START,5,2) AND 04<=JT.SUBSTR(ENDID,5,2) THEN 'APR'
WHEN 05>=JT.SUBSTR(START,5,2) AND 05<=JT.SUBSTR(ENDID,5,2) THEN 'MAY'
WHEN 06>=JT.SUBSTR(START,5,2) AND 06<=JT.SUBSTR(ENDID,5,2) THEN 'JUNE'
WHEN 07>=JT.SUBSTR(START,5,2) AND 07<=JT.SUBSTR(ENDID,5,2) THEN 'JULY'
WHEN 08>=JT.SUBSTR(START,5,2) AND 08<=JT.SUBSTR(ENDID,5,2) THEN 'AUG'
WHEN 09>=JT.SUBSTR(START,5,2) AND 09<=JT.SUBSTR(ENDID,5,2) THEN 'SEPT'
WHEN 10>=JT.SUBSTR(START,5,2) AND 10<=JT.SUBSTR(ENDID,5,2) THEN 'OCT'
WHEN 11>=JT.SUBSTR(START,5,2) AND 11<=JT.SUBSTR(ENDID,5,2) THEN 'NOV'
WHEN 12>=JT.SUBSTR(START,5,2) AND 12<=JT.SUBSTR(ENDID,5,2) THEN 'DEC' ELSE 'N/A' END
答案 0 :(得分:1)
据我了解,您需要整年的边界日期(在这种情况下为2018年至2019年)。因此应该有24行。如果这24个月与边界日期之间的间隔月份相吻合,则您需要计数1,否则为0。因此,请考虑:
.frame(height: ..)
其中SELECT SUBSTR(t1.months,1,4) as "Year",
TO_CHAR( TO_DATE(t1.months,'yyyymm'), 'Month' ) as "Month",
NVL2(t2.months,1,0) as "Count"
FROM
(
SELECT y.years||m.months as months
FROM
(
SELECT DISTINCT TO_CHAR(ADD_MONTHS( TO_DATE('20181202','yyyymmdd') , level - 1 ),'yyyy')
as years
FROM dual
CONNECT BY level <=
MONTHS_BETWEEN(TO_DATE('20190202','yyyymmdd'),TO_DATE('20181202','yyyymmdd')) + 1 ) y
CROSS JOIN
(
SELECT LPAD(LEVEL,2,'0') months
FROM dual
CONNECT BY level <= 12
) m
) t1
LEFT JOIN
(
SELECT TO_CHAR(ADD_MONTHS( TO_DATE('20181202','yyyymmdd') , level - 1 ),'yyyymm')
as months
FROM dual
CONNECT BY level <=
MONTHS_BETWEEN(TO_DATE('20190202','yyyymmdd'),TO_DATE('20181202','yyyymmdd')) + 1
) t2
ON t1.months = t2.months
ORDER BY t1.months
,然后递归CROSS JOIN
。