我有一个名为Calls的表,其中包含以下字段。
我想创建一个按周分组调用的视图,并显示以下列:
我从这个定义开始:
CREATE VIEW TotalView AS select
Call.Week,
Count(ID) as TotalCalls
From
Call
GROUP BY
Call.Week;
Weeks和TotalCalls正确显示。然后,我尝试计算满意度得分少于3的呼叫,但结果是错误的。我输入这个声明
...
select
Call.Week,
Count(ID) as TotalCalls,
Count(CallsLess) as CallsLess3
From
Call,
(select ID as CallsLess from Call where SatisfactionRate<3)
GROUP BY
Call.Week
...但结果表完全错误,现在TotalCalls列甚至是错误的。
通过将case表达式放在聚合函数中来使用“条件聚合”。
CREATE VIEW TotalView AS select
Call.Week,
Count(ID) as TotalCalls,
(Count( case when exit_time is null then 1 end ) * 100.0 ) / count(*) as SatisfactionScore
From
Call
GROUP BY
Call.Week;
要实现非标准日历,可能需要您构建一个日历表并使用该日历表来通知您的查询如何定义要处理的周数。我总是喜欢在一周内保持7天的时间,其他任何东西都令人困惑。
Postgres支持filter
子句,它使条件聚合几乎是友好的:
select c.Week as call_week,
count(*) as total_calls,
count(*) filter (where c.exittime is null) as abandoned_calls,
avg( (c.exttime is null)::int ) as abandon_rate,
count(*) filter (where c.satisfaction < 3) as low_satisfaction
from call c
group by c.Week;
使用条件聚合:
select
week,
count(*) totalcalls,
100.0 * sum(case when exittime is null then 1 else 0 end) / count(*) abandonrate,
sum(case when satisfactionrate < 3 then 1 else 0 end) callsless3
from call
group by date_trunc('month', date)::DATE, week