Sql 如何在Oracle中获取两个日期ID之间的每月计数

Sql 如何在Oracle中获取两个日期ID之间的每月计数,sql,oracle,Sql,Oracle,我想得到两个日期之间的每月计数。例如,让我们采用以下范围: 20181202-20190202 该范围将为2018年12月和2019年1月、2月的计数提供+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'

我想得到两个日期之间的每月计数。例如,让我们采用以下范围:

20181202-20190202

该范围将为2018年12月和2019年1月、2月的计数提供+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

据我所知,在这种情况下,您需要完整的边界日期2018-2019年。所以应该有24行。如果这24个月与边界日期之间的间隔月一致,那么你需要一个计数,否则为零。因此,考虑:

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
其中交叉连接,然后以递归方式左连接


起始和结束ID列是哪种数据类型?里面存储了什么值?举一个例子。它们是数字数据类型,可以在上面看到例子20181202、20190202。您是否尝试获取两个日期之间的月数开始和结束月份是否包含在内?例如,您是否希望从示例输入中获得3。。?或者列出所有月份,例如2018DEC-2019JAN-2019FEB?@BarbarosÖzhan我希望该视图能够生成一个结果,其中年份为列,月份为列,计数为列。开始月份和结束月份包括在内!因此,在包含2018年12月的行中,在这种情况下,所有其他有效月份的计数也应为1。您能否简要解释一下您在这里所做的工作?正如我的用户名所示,我对这些概念还很陌生:/。我首先需要问一下,这是你想要的结果吗@新手_programmer9623I在第一步中确定边界日期涉及的所有年份和月份,然后通过交叉连接(例如笛卡尔积)生成年份乘以12个月,并使用左连接保留第一步中生成的所有行。在所有这些过程中,我生成了日期范围的年-月对作为最右边的子查询,并通过最右边的子查询@Noveler_programmer9623中的空值将它们的计数视为1,其他的计数视为0。谢谢,我是否可以在这个查询中使用开始和结束ID字段?当我用原始的join I hadyou's welcome@noveler_programmer9623替换您的FROM子句时,我收到一个错误消息,表示找不到START。start是一个保留关键字,除非引用start或start或start,否则不能作为列名…,例如,您可以将其替换为startid。顺便说一句,在您的查询中,20181202可能被替换为“&startid”,20190202可能被替换为“&endid”替换变量。