用聚合函数重写查询

时间:2018-12-26 15:17:45

标签: sql oracle

我有这样的查询:

select nvl(o.org_id, o.org_name) as organization,
       count(distinct c.client_id) as clients,
       count(distinct (case when c.delay_days_max>3 then c.client_id end)) as delay_above_3d,
       count(distinct c.contact_phone) as contacts,
       case when sum(c.max_debt) > 0 then round(sum(case when c.delay_days>3 then c.new_debt else 0 end) / sum(c.max_debt)*100, 2) as delay_rate_above_3d
from organizations o
left join(select cl.client_id, cl.delay_days_max, cl.contact_phone, 
                 r.max_debt, r.delay_days, r.new_debt
          from clients_all cl
          join reports_all r
           on cl.cl.contact_phone = r.contact_phone) c
  on c.client_id = o.client_id
group by o.org_id, o.org_name;  

实际上,我尝试创建表c_table来保留上述c子查询的结果。我想保存已经分组的数据,按client_id分组,但是当我尝试这样做时:

create table c_table as
select cl.client_id, 
       count(cl.delay_days_max) as delay_days_max, 
       count(cl.contact_phone) as cl.contact_phone, 
       sum(r.max_debt) as max_debt, 
       sum(r.delay_days) as delay_days, 
       max(r.new_debt) as new_debt
from clients_all cl
join reports_all r
on cl.cl.contact_phone = r.contact_phone
group by cl.client_id;

我得到错误的列计算结果。是否有解决方案可将c_table上的有效数据插入client_id中?非常感谢您提供任何信息。

1 个答案:

答案 0 :(得分:0)

也许您的问题出在JOIN与聚合函数之间的交互作用上。

尝试以下方法:

create table c_table as
select cl.client_id, 
       count(cl.delay_days_max) as delay_days_max, 
       count(cl.contact_phone) as contact_phone, 
       max_debt, 
       delay_days, 
       new_debt
from clients_all cl
join (
    select contact_phone,
           sum(r.max_debt) as max_debt, 
           sum(r.delay_days) as delay_days, 
           max(r.new_debt) as new_debtrep
    from reports_all
    group by contact_phone) r
on cl.contact_phone = r.contact_phone
group by cl.client_id;