oracle:每个月开始计算课程

时间:2018-03-19 20:25:49

标签: sql oracle

我正在尝试计算每个月开课的课程。

select
   to_char(START_DATE_TIME,'MON'),
   count(START_DATE_TIME)
from
   SECTION
having 
   count(START_DATE_TIME) > 1
group by 
   START_DATE_TIME

它给我输出

MAY 4
APR 3
MAY 2
JUN 2
APR 2
JUL 7
JUL 7
JUN 3
APR 4
MAY 2
APR 6
MAY 4
JUN 2
JUN 2
JUN 3
MAY 5
JUN 2
APR 3
MAY 3
JUN 3
MAY 2
APR 2
MAY 3

我需要类似于此

的输出
Start_Month Count 
July        14 
June        17 
April       21
May         26

2 个答案:

答案 0 :(得分:1)

在所有计数中使用“to_char(START_DATE_TIME,'MON')”,分组,拥有和排序。

select
   to_char(START_DATE_TIME,'MON') as Start_Month ,
   count(to_char(START_DATE_TIME,'MON')) as Count 
from
   SECTION
having 
   count(to_char(START_DATE_TIME,'MON')) > 1
group by 
   to_char(START_DATE_TIME,'MON')
order by 
   count(to_char(START_DATE_TIME,'MON'));

答案 1 :(得分:1)

  1. 使用group by START_DATE_TIME,您告诉DBMS您希望每个START_DATE_TIME有一个结果行。但实际上你想要的是每月一个结果行,所以逐个分组。
  2. count(START_DATE_TIME)计算START_DATE_TIME不为空的行。当您按此日期分组时,这没有任何意义。无条件地计算行数(COUNT(*))。
  3. having count(START_DATE_TIME) > 1当然发生在GROUP BY之后,因此应该放在它后面。看到它在错误的地方看起来很奇怪。而且:在这种情况下你想要达到什么目的?每个START_DATE_TIME会得到一个结果行,因为表中的日期至少有一条记录。所以当然这种情况适用于所有日期。 (如果为空,则START_DATE_TIME可以为空。但是,您只需应用WHERE START_DATE_TIME IS NOT NULL。)
  4. 更正了查询:

    select
      to_char(start_date_time, 'Month') as "Start_Month",
      count(*) as "Count"
    from section
    group by to_char(start_date_time, 'Month')
    order by "Count";
    
    顺便说一句:我想你知道无论一年如何,你都在看几个月。如果您想更改此设置,请相应更改TO_CHAR格式。