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