我们有一个如下表:
我想按月分类“类型”列数,再按一列显示重复次数。(我们需要的是12 x类型(这里我们有三种类型)(1,2,4) ))。我希望我的结果如下:
即使没有月份记录(图片中的绿色0),我也需要记录
我需要在同一个表上使用join命令两次吗?
答案 0 :(得分:0)
您需要先生成所有类型值的完整列表。如果你没有外键到另一个表,你就可以这样。
select distinct type
from the_table
您显然希望将一个月的所有数字放入一行,而不管年份如何,因此您需要另外一个包含12行的列表来加入:
select level
from dual
connect by level <= 12;
现在这两个可以放在一起并加入你的桌子:
with all_types as (
select distinct type
from the_table
), all_months (month_nr) as (
select level
from dual
connect by level <= 12
)
select at.type, am.month_nr, count(*)
from all_types at
cross join all_months am
left join the_table t
on t.type = at.type
and extract(month from t.session_date) = am.month_nr
group by at.type, am.month_nr
order by at.type, am.month_nr;
这会将月份显示为数字,如果您需要将其作为文字显示,请在最终选择的选择列表中使用to_char(to_date(am.month_nr, 'mm'), 'Mon') as month
而不是am.month_nr
。
答案 1 :(得分:0)
您需要cross join
(以生成所有可能的不同类型和月份的组合)和left join
与您的表格,并最终聚合以获得所需的计数。
select m.month,
x.type,
count(t.type)
from (
select to_char(add_months(sysdate, level), 'Mon') as month
from dual connect by level <= 12
) m
cross join (
select distinct type
from your_table
) x
left join your_table t on m.month = to_char(t.session_date, 'Mon')
and x.type = t.type
group by m.month,
x.type
order by x.type, to_date(m.month, 'Mon');