希望得到记录计数为每个月。但是,几个月没有记录,因此不返回行。我怎么能得到那个月的计数为0?
select months, count(rowid) as counter from (
select to_char(date_entered, 'MM') as months
from mydatatable
where to_char(date_entered, 'yyyy') = '2011'
)
group by months
order by months
字符串
测试结果:
Month Count
01 32
03 12
04 11
06 10
07 222
08 32
型
甚至试着玩subq select 1,2,3,4,5,6,7,8,9,10,11,12 from dual
,也无法让它工作。还没有pivot功能...;(
5条答案
按热度按时间4szc88ey1#
你可能最好将01到12存储在一个表中,但一般的方法是使用左连接:
字符串
更新使用了一种更友好的索引方式来限制年份。
http://sqlfiddle.com/#!4/68085/10
wnvonmuf2#
您需要构建自己的12行月份“表”并执行左外连接。从您的问题中提取查询,并使其成为提供数据的内联视图。
字符串
结果应该是这样的:
型
h5qlskok3#
您可以使用分层查询的
connect by
语法构建一个包含月份数字的虚拟表,然后左连接到您的数据:字符串
一些数据:
型
...这给出:
型
或者SQL Fiddle,因为这似乎是这些天要做的事情...
通常最好避免类似
to_char(date_entered, 'yyyy') = '2011'
的东西,因为您将to_char()
函数应用于表中的每一行,如果该列上有索引,则不会使用它。相反,尝试转换筛选器以匹配列的数据类型,如date_entered > date '2011-01-01' and date_entered < date '2012-01-01'
。在这种情况下,它可以在连接条件中处理-我将每个月转换为2011年的日期范围,并且只在该月份范围内查找匹配的记录。oxalkeyp4#
这很奇怪。。也许我误解了问题或数据...?在问题中添加表格和数据总是一个好主意。您应该通过计数获取所有月份的所有数据。我试过这个:
字符串
正如你所看到的,第4和第5个月没有值:
型
再举个例子:第2个月没有值,但我仍然可以计数。也许你需要总结一下你的价值观……:
型
tvmytwxo5#
这是我的示例,其中DAT_ULT_ALT类似于更新日期:
SELECT TO_CHAR(TMP_ULT_ALT,'YYYY-MM')输入,计数(*)FROM表组输入顺序1