如何在sql中的一个表上使用连接功能

时间:2017-03-27 21:22:48

标签: sql oracle

我们有一个如下表:

data we have

我想按月分类“类型”列数,再按一列显示重复次数。(我们需要的是12 x类型(这里我们有三种类型)(1,2,4) ))。我希望我的结果如下:

the result we need

即使没有月份记录(图片中的绿色0),我也需要记录

我需要在同一个表上使用join命令两次吗?

2 个答案:

答案 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');

Demo