【问题标题】:Oracle 11g: How to merge two result setsOracle 11g:如何合并两个结果集
【发布时间】:2019-06-29 17:44:42
【问题描述】:

我正在使用 Oracle 数据库,我无法从 2 个结果集中获取一个结果。

我有表格案例

Create table cases (ID varchar(1), date_entered date, sub_category varchar (5));

insert into cases (id, date_entered, sub_category)
values('1', to_date('2012/05/03','yyyy/mm/dd'),'Temp1');
insert into cases (id, date_entered, sub_category)
values('2', to_date('2012/06/01','yyyy/mm/dd'),'Temp2');
insert into cases (id, date_entered, sub_category)
values('3', to_date('2012/03/15','yyyy/mm/dd'),'Temp3');
insert into cases (id, date_entered, sub_category)
values('4', to_date('2012/03/01','yyyy/mm/dd'),'Call1');
insert into cases (id, date_entered, sub_category)
values('5', to_date('2012/03/08','yyyy/mm/dd'),'Call2');
insert into cases (id, date_entered, sub_category)
values('6', to_date('2012/02/20','yyyy/mm/dd'),'Call2');

并且需要按子类别、按月统计记录,其中一个计数包括sub_category:Temp1、Temp2、Temp3 其他计数包括sub_category:Call1、Call2、Call3

我已经查询1:

With skills
    AS 
    ( 
          Select sub_category, 
                 date_entered,
                 extract(MONTH FROM cases.date_entered) as month_entered, 
                 count (*)
          from cases 
          where 
                SUB_CATEGORY IN('Temp1', 'Temp2', 'Temp3')


          group by cases.sub_category, cases.date_entered
          order by to_char(cases.date_entered,'MM')
    )

    select  s.month_entered, 
            count(*)as skill_count
            from skills s

    group by s.month_entered
    ORDER BY CAST(s.month_entered AS INTEGER) ASC

结果:

MONTH_ENTERED   SKILL_COUNT
3               1
5               1
6               1

和查询 2:

With training
AS 
( 
      Select sub_category, 
             date_entered,
             extract(MONTH FROM cases.date_entered) as month_entered, 
             count (*)
      from cases 
      where 
            SUB_CATEGORY IN('Call1', 'Call2', 'Call3')


      group by cases.sub_category, cases.date_entered
      order by to_char(cases.date_entered,'MM')
)

select  t.month_entered, 
        count(*)as training_count
        from training t

group by t.month_entered
ORDER BY CAST(t.month_entered AS INTEGER) ASC

结果:

MONTH_ENTERED   TRAINING_COUNT
2                1
3                2

我需要从这两个查询中得到的结果是:

MONTH_ENTERED   SKILL_COUNT  TRAINING_COUNT
    2               0            1
    3               1            2
    5               1            0
    6               1            0

尝试联合和左连接,但没有给我这个结果。

这里是 sqlfiddle 示例 http://sqlfiddle.com/#!4/504cd/31

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:
    SELECT
      EXTRACT(MONTH FROM CASES.DATE_ENTERED) AS MONTH_ENTERED,
      COUNT (CASE WHEN SUB_CATEGORY IN('Temp1', 'Temp2', 'Temp3') THEN 1 END) SKILL_COUNT,
      COUNT (CASE WHEN SUB_CATEGORY IN('Call1', 'Call2', 'Call3') THEN 1 END) TRAINING_COUNT
    FROM CASES
    GROUP BY EXTRACT(MONTH FROM DATE_ENTERED)
    ORDER BY MONTH_ENTERED ASC
    

    【讨论】:

    • 太棒了。感谢您的努力和快速答复。
    【解决方案2】:

    我认为您可以将查询大大简化为:

          Select extract(MONTH FROM cases.date_entered) as month_entered, 
                 sum(case when SUB_CATEGORY IN('Temp1', 'Temp2', 'Temp3') then 1 else 0 end) as Skill_Count,
                 sum(case when SUB_CATEGORY IN('Call1', 'Call2', 'Call3') then 1 else 0 end) as Skill_Count,
          from cases 
          group by extract(MONTH FROM cases.date_entered)
          order by extract(MONTH FROM cases.date_entered)
    

    【讨论】:

    • 感谢您的快速回答和简化!它接近解决方案,但它为行军提供了 3 行。看起来 GuiGi 的答案更适合这个。
    • 你说得对。 . .我错过了部分陈述。
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多