现在做一个项目,有一个工单表,需要统计。表名sheet,包含以下列
SHEET_ID        工单号
PHE_TYPE_ID     工单类型
AREA_CODE       地区代码
OVER_DATE       结束日期
CREATE_OPERATOR      创建者
OVER_OPERATOR       结束者
DEAL_FLAG           处理标识,有4种,分别为1、2、3、4
SEND_FLAG           派单标识,有5种,分别为0、1、2、3、4
CREATE_DATE         生成日期
EXPERT_OPERATOR     专家级操作人
现在需要统计4种处理标识和5种派单标识的工单,在某段时间内共产生多少,请问该如何编写才能更有效率的执行。每日产生数据6-8W条,可能会按季度统计,整个表一年的数据量大概在3000W左右。谢谢。
第一次发帖,问题描述的可能不够清楚,表示歉意。

解决方案 »

  1.   


    select 
            
           phe_type_id,
           (select count(*) from sheet where phe_type_id = s.phe_type_id ) as 所有工单,
           (select count(*) from sheet where phe_type_id = s.phe_type_id and deal_flag in(1,3)) as 成功,
           (select count(*) from sheet where phe_type_id = s.phe_type_id and deal_flag='2') as 失败,
           (select count(*) from sheet where phe_type_id = s.phe_type_id and send_flag = '1') as 派单至专家席,
           (select count(*) from sheet where phe_type_id = s.phe_type_id and send_flag = '2') as 派单到外系统,
           (select count(*) from sheet where phe_type_id = s.phe_type_id and send_flag = 'a' and deal_flag in (1,3)) as 专家席处理成功
    from sheet s
    where  CREATE_DATE between a and b
    group by phe_type_id这样子写的话,如果统计指标有15个的话,我对时间段内的每个数据都要运行15个查询,如果统计3个月的数据量的话,效率应该低的不行了吧?
      

  2.   

    做成子查询
    同时加上DECODE进行区分
      

  3.   

    试试
    select  phe_type_id,
    sum(cnt) as 所有工单,
    sum(case when deal_flag =1 and deal_flag =3  then num else 0 end) as 成功,
    --.....以此类推
    from sheet s,
    (select  phe_type_id,deal_flag,send_flag,count(*) as cnt from sheet group by  phe_type_id,deal_flag ) sd
    where sd.phe_type_id = s.phe_type_id
      

  4.   

    select  phe_type_id,
    sum(cnt) as 所有工单,
    sum(case when deal_flag =1 and deal_flag =3  then num else 0 end) as 成功,
    --.....以此类推
    from sheet s,
    (select  phe_type_id,deal_flag,send_flag,count(*) as cnt from sheet group by  phe_type_id,deal_flag ) sd
    where sd.phe_type_id = s.phe_type_id
    group by phe_type_id忘记加GROUP BY了,嘿嘿
      

  5.   


    -- 这样是否好点???
    select phe_type_id,
    count(1) 所有工单,
    sum(case when deal_flag in (1,3) then 1 else 0 end) 成功,
    sum(decode(deal_flag,2,1,0)) 失败,
    sum(decode(send_flag,1,1,0)) 派单至专家席,
    sum(decode(send_flag,2,1,0)) 派单到外系统,
    sum(case when send_flag=1 and deal_flag in (1,3) then 1 else 0 end) 专家席处理成功
    from sheet s
    where CREATE_DATE between a and b
    group by phe_type_id
      

  6.   


    select phe_type_id,
      count(1) as 所有工单,
      count(case when deal_flag in(1,3) then 1 end) as 成功,
      count(case when deal_flag='2' then 1 end) as 失败,
      count(case when send_flag = '1' then 1 end) as 派单至专家席,
      count(case when send_flag = '2' then 1 end) as 派单到外系统,
      count(case when send_flag = 'a' and deal_flag in (1,3) then 1 end) as 专家席处理成功
    from sheet 
    where CREATE_DATE between a and b
    group by phe_type_id
      

  7.   

    晕  要引发  case when 和decode 的效率问题争论么