无法生成SQL查询

问题描述 投票:0回答:3

我有一个名为Calls的表,其中包含以下字段。

  • ID
  • EntryTime
  • ExitTime(这可以是NULL,表示放弃调用)
  • 日期
  • 周(基于日期的月份)
  • 满意度分数(1-5)

我想创建一个按周分组调用的视图,并显示以下列:

  • 每周总呼叫数
  • 每周放弃率(Total Calls除以ExitTime的调用次数为NULL)
  • 呼叫满意度得分低于每周3次

我从这个定义开始:

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列甚至是错误的。

  1. 你能告诉我该怎么写这个查询吗?
  2. 我特定月份的数据涵盖5周。我是否也可以将第4周和第5周分为一组,以便在最终视图中最终得到4行?
sql postgresql view
3个回答
0
投票

通过将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天的时间,其他任何东西都令人困惑。


0
投票

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; 

0
投票

使用条件聚合:

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
© www.soinside.com 2019 - 2024. All rights reserved.