我在代表和客户端级别都有指标:
select r.rep_month, c.client_month,
count(distinct r.id) reps, count(distinct c.id) clients
from clients c
left join reps r on c.rep_id=r.id
这当然不起作用,因为它给出了rep_month / client_month-的所有组合,并且从时间序列的角度来看 - 它们应该基于两个不同的日期来计算。
我需要的是基于rep_month计算代表和基于client_month计算的客户端,所以输出中应该只有一个日期。
一个通用的例子是这样的:
rep_date client_date reps clients
3/1/18 0:00 8/1/17 0:00 14 24
3/1/18 0:00 2/1/17 0:00 4 6
3/1/18 0:00 12/1/17 0:00 9 12
3/1/18 0:00 1/1/18 0:00 14 16
3/1/18 0:00 10/1/17 0:00 11 11
3/1/18 0:00 12/1/16 0:00 4 7
3/1/18 0:00 1/1/17 0:00 1 1
3/1/18 0:00 4/1/17 0:00 4 4
3/1/18 0:00 3/1/17 0:00 12 14
3/1/18 0:00 11/1/17 0:00 5 7
3/1/18 0:00 5/1/17 0:00 4 5
3/1/18 0:00 11/1/16 0:00 1 1
3/1/18 0:00 2/1/18 0:00 5 5
3/1/18 0:00 8/1/16 0:00 2 2
3/1/18 0:00 9/1/17 0:00 16 20
3/1/18 0:00 (null) 49 0
这将是预期的输出:
date reps clients
3/1/18 49 135
但请注意,可能存在rep_date和client_date不为空的情况,因此将两者合并为:coalesce(client_date,rep_date)
无法正常工作。
谢谢!
答案 0 :(得分:1)
我想你想要这样的东西:
select mon, sum(reps) as reps, sum(clients) as clients
from ((select c.client_month as mon, count(*) as clients, 0 as reps
from clients c
group by c.client_month
) union all
(select r.rep_month, 0 as clients, count(*) as reps
from reps r
group by r.rep_month
)
) rc
group by mon
order by mon;
注意:
join
执行此操作,但是您必须处理两个表中缺少的时间段(即,您需要full outer join
和许多coalesce()
)。 id
在每个表中都是唯一的,因此count(*)
和count(distinct id)
执行相同的操作。前者更有效,因为删除重复项不会产生开销。答案 1 :(得分:0)
您可以尝试:
Select r.rep_month, c.client, r.reps from
(select rep_month, count(distinct id) reps
from reps
group by rep_month) r
left join
(select client_month, count(distinct id) clients
from clients
group by client_month) c
on r.rep_month = c.client_month
你可以加入id,只是加入月份是没有意义的。或者,如果有一个包含id的主表,请先从该表开始。此外,客户表必须包含所有月份。如果每个月都有代表,请先将该表放入,然后再离开。