Oracle 查询以获取月份数据并为不可用的月份提供 0

Posted

技术标签:

【中文标题】Oracle 查询以获取月份数据并为不可用的月份提供 0【英文标题】:Oracle query to get month wise data and give 0 for month not available 【发布时间】:2014-06-09 10:47:50 【问题描述】:

以下是我的表格数据

time_stamp     Name
01-Mar-14      a
02-Mar-14      b
02-Mar-14      c
01-May-14      d
02-May-14      e
01-Jun-14      f

需要输出:

(3,0,2,1) (Month wise count with 0 if month doesn't exist)

我创建了以下查询:

select 
 listagg(count(1),',') within group (order by EXTRACT(month FROM time_stamp)) 
from ps_bqueues_host 
where time_stamp BETWEEN TO_DATE('01-Mar-14', 'DD-Mon-YY') and
  TO_DATE('01-Jun-14', 'DD-Mon-YY') GROUP BY EXTRACT(month FROM time_stamp)

这给了我输出:

(3,2,1) (Month of Apr with 0 is not there).

请建议如何按所有月份分组。

谢谢。

【问题讨论】:

您需要加入一个包含所有月份范围的子选择表。然后显示按所有列出的月份分组的计数(time_stamp)。在这里,您可以看到如何使用月份填充子选择表的示例:***.com/questions/4375897/connected-by-months 或 ***.com/questions/4644562/… 【参考方案1】:

您应该将这个原始表与给定期间所有月份的表连接起来。如果是一年内,那么we need 1,2,3,...12 sequence。

select 
 listagg(count(Name),',') within 
    group (order by m.rn) 
from 
     (SELECT * FROM  ps_bqueues_host 
      where time_stamp 
        BETWEEN TO_DATE('01-Mar-14', 'DD-Mon-YY') 
        and     TO_DATE('01-Jun-14', 'DD-Mon-YY') 
     )   
RIGHT JOIN 
     (SELECT LEVEL rn FROM dual CONNECT BY LEVEL <= 12) m
     ON m.rn=EXTRACT(month FROM time_stamp)

WHERE m.rn BETWEEN EXTRACT(month FROM TO_DATE('01-Mar-14', 'DD-Mon-YY'))
           AND  EXTRACT(month FROM TO_DATE('01-Jun-14', 'DD-Mon-YY'))
GROUP BY m.rn

SQLFiddle demo

【讨论】:

感谢您的帮助,但输出不正确。使用您的查询,输出为 (0,0,7050,0)。但是,使用以下查询,月数可能为 5274: select count(time_stamp) from ps_bqueues_host where time_stamp BETWEEN TO_DATE('01-May-14', 'DD-Mon-YY') and TO_DATE('31-May- 14','DD-Mon-YY')。预期结果为 (0,0,5274,0) time_stamp 字段是否包含时间部分?如果是这样,那么您的查询不计算 31.05.2014 的最新日期尝试使用 and TO_DATE('01-Jun-14', 'DD-Mon-YY') 而不是 31 May 2014 没错。 '01-Jun-14' 工作。请建议如何处理?我的意思是有没有办法在不查询到第二天的情况下也包含最后一天的数据? 这是因为31-May-2014 23:00:01 > '31-May-2014'。您应该添加一天,例如 ...and TO_DATE('31-May-14', 'DD-Mon-YY')+1 或添加时间 ..and To_date('31-May-2014 23:59:59','mm-Mon-yy hh24:mi:ss') 我选择了 To_date('31-May-2014 23:59:59','mm-Mon-yy hh24:mi:ss') 并且它有效。感谢您的帮助!

以上是关于Oracle 查询以获取月份数据并为不可用的月份提供 0的主要内容,如果未能解决你的问题,请参考以下文章

Oracle sql developer 日期/月份数据提取查询和语法

SQL查询以获取特定年份的当前日期(考虑月份和日期)的数据

SQL查询以获取从当前月份开始的月份列表

oracle sql中的月份数到月份文本

如何从 Hive 表中获取月份 = 当前月份 else 月份 = 上个月(当前月份 - 1)的记录?

45 个非常有用的 Oracle 查询语句