oracle case when 语句帮忙解决

Jerss 2011-04-11 11:11:10
Select A.StartTime as 时间分组,A.Counts 呼入总次数,nvl(B.Counts,0) 成功总次数,nvl(C.Counts,0) 失败总次数,
nvl(D.Counts,0) 转人工总次数,nvl(E.Counts,0) 转人工成功次数,
case
when nvl(D.Counts,0)=0 then 0 else nvl(E.Counts,0)*100/D.Counts end as 转人工接通率(100%) --未找到from语句
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
end
from
(select count(*) from *** )A left outer join
(select count(*) from *** )B left outer join
(select count(*) from *** )C left outer join
(select count(*) from *** )D left outer join
(select count(*) from *** )E left outer join

在线等待。。。
...全文
1719 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jerss 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 taikongxinke 的回复:]
不是很明白你的需求,“转人工接通率(100%)”,“转人工失败次数”这个是列名还是列的内容?
[/Quote]

列名
Jerss 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 taikongxinke 的回复:]
case when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts else nvl(D.Counts,0)-nvl(E.Counts,0)) end 在这个基础上再做一个行列转换就可以了。
[/Quote]

列名
千骑卷平冈 2011-04-11
  • 打赏
  • 举报
回复
弱弱的问一句,你最后一个“left outer join”连接哪个表。。。
taikongxinke 2011-04-11
  • 打赏
  • 举报
回复
不是很明白你的需求,“转人工接通率(100%)”,“转人工失败次数”这个是列名还是列的内容?
taikongxinke 2011-04-11
  • 打赏
  • 举报
回复
case when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts else nvl(D.Counts,0)-nvl(E.Counts,0)) end 在这个基础上再做一个行列转换就可以了。
Jerss 2011-04-11
  • 打赏
  • 举报
回复
Select A.StartTime as 时间分组,A.Counts 呼入总次数,nvl(B.Counts,0) 成功总次数,nvl(C.Counts,0) 失败总次数,
nvl(D.Counts,0) 转人工总次数,nvl(E.Counts,0) 转人工成功次数,
case
when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
end
from


上面所有列的数据都是从下面的select 语句中查出来的
我只是想在第五列做个判断
如果 nvl(D.Counts,0)=0 显示的结果为 nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
那么 显示的结果为 (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
Jerss 2011-04-11
  • 打赏
  • 举报
回复
Select A.StartTime as 时间分组,A.Counts 呼入总次数,nvl(B.Counts,0) 成功总次数,nvl(C.Counts,0) 失败总次数,
nvl(D.Counts,0) 转人工总次数,nvl(E.Counts,0) 转人工成功次数,
case
when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
end
from

(select '2006-03-01 15:00:00~2011-04-01 15:00:00' as StartTime,count(*) as Counts
from SRRecord where StartTime>='2006-03-01 15:00:00','yyyy-mm-dd hh24:mi:ss') and StartTime<='2011-04-01 15:00:00','yyyy-mm-dd hh24:mi:ss')
and ServiceChainIndex = 0 --呼入总次数
) A left outer join

(select '2006-03-01 15:00:00~2011-04-01 15:00:00' as StartTime,count(*) as Counts
from SRRecord where StartTime>=to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss') and StartTime<=to_date(p_StopTime,'yyyy-mm-dd hh24:mi:ss')
and (ServiceChainIndex = 1) AND (EndReason = '11') AND (ISO <> 'T')
) B on A.StartTime=B.StartTime left outer join --应答成功总次数

(select '2006-03-01 15:00:00~2011-04-01 15:00:00' as StartTime,count(*) as Counts
from SRRecord where StartTime>='2006-03-01 15:00:00','yyyy-mm-dd hh24:mi:ss') and StartTime<='2011-04-01 15:00:00','yyyy-mm-dd hh24:mi:ss')
and ((ServiceChainIndex = 0) And (EndReason<>'7') And (EndReason<>'515')) OR ((ServiceChainIndex = 1) AND (EndReason <> '11') AND (ISO <> 'T') And (SPType is null))
) C on A.StartTime=C.StartTime left outer join --应答失败总次数

(select '2006-03-01 15:00:00~2011-04-01 15:00:00' as StartTime,count(distinct SRID) as Counts
from SRRecord where StartTime>='2006-03-01 15:00:00','yyyy-mm-dd hh24:mi:ss') and StartTime<='2011-04-01 15:00:00','yyyy-mm-dd hh24:mi:ss')
and (EndReason = 20 and ISO<>'T' ) --IVR转座席次数,但不重复计算
) D on A.StartTime=D.StartTime left outer join

(select '2006-03-01 15:00:00~2011-04-01 15:00:00' as StartTime,count(distinct SRID) as Counts
from SRRecord where StartTime>='2006-03-01 15:00:00','yyyy-mm-dd hh24:mi:ss') and StartTime<='2011-04-01 15:00:00','yyyy-mm-dd hh24:mi:ss')
and (EndReason = 21 and ISO<>'T' ) --IVR转座席成功,但不重复计算
) E on A.StartTime=E.StartTime
Jerss 2011-04-11
  • 打赏
  • 举报
回复
为什么不能定义两个别名????
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jersslong 的回复:]
我只需要显示一列
当 nvl(D.Counts,0)=0 就显示为 nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
nvl(D.Counts,0)<>0 就显示为 (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
[/Quote]
仔细想想你的需求 列名怎么可能会做到动态的呢?
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jersslong 的回复:]
只需要显示一列

ase
when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
[/Quote]
如果是一列的话 你怎么能定义两个列别名呢?
Jerss 2011-04-11
  • 打赏
  • 举报
回复
我只需要显示一列
当 nvl(D.Counts,0)=0 就显示为 nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
nvl(D.Counts,0)<>0 就显示为 (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
Jerss 2011-04-11
  • 打赏
  • 举报
回复
只需要显示一列

ase
when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
Jerss 2011-04-11
  • 打赏
  • 举报
回复
不好意思多了个
else nvl(E.Counts,0)*100/D.Counts end as 转人工接通率(100%)

  • 打赏
  • 举报
回复
如果你是根据那个列的值 来判断
想要显示两列的话 请用两个case when...
Jerss 2011-04-11
  • 打赏
  • 举报
回复
Select A.StartTime as 时间分组,A.Counts 呼入总次数,nvl(B.Counts,0) 成功总次数,nvl(C.Counts,0) 失败总次数,
nvl(D.Counts,0) 转人工总次数,nvl(E.Counts,0) 转人工成功次数,
case
when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
else nvl(E.Counts,0)*100/D.Counts end as 转人工接通率(100%)
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
end
from
(select count(*) as Counts from *** )A left outer join
(select count(*) as Counts from *** )B left outer join
(select count(*) as Counts from *** )C left outer join
(select count(*) as Counts from *** )D left outer join
(select count(*) as Counts from *** )E left outer join

错误是:
when nvl(D.Counts,0)=0 then nvl(E.Counts,0)*100/D.Counts as 转人工接通率(100%)
as 缺失关键字
LiuHaoNan 2011-04-11
  • 打赏
  • 举报
回复
起别名的话要有对象的,比如
when nvl(D.Counts,0)=0 then XXXX as 转人工接通率(100%)(100%) ;
你是不是打漏XXX了;
这个是语法错误,仔细看看啊, 不带这么玩的
Jerss 2011-04-11
  • 打赏
  • 举报
回复
“转人工接通率(100%)”
这是一列动态数据从
(select count(*) from *** )D left outer join
(select count(*) from *** )E left outer join
这两个查询语句中得

也就是((select count(*) from *** )D left outer join)-((select count(*) from *** )E left outer join) as 转人工接通率(100%)

LiuHaoNan 2011-04-11
  • 打赏
  • 举报
回复
错误为 在 case
when nvl(D.Counts,0)=0 then as--缺失关键字 转人工接通率(100%)(100%)


then 要有内容的,你是对什么起的别名为 "转人工接通率(100%)(100%)"呢
Jerss 2011-04-11
  • 打赏
  • 举报
回复
Select A.StartTime as 时间分组,A.Counts 呼入总次数,nvl(B.Counts,0) 成功总次数,nvl(C.Counts,0) 失败总次数,
nvl(D.Counts,0) 转人工总次数,nvl(E.Counts,0) 转人工成功次数,

case
when nvl(D.Counts,0)=0 then as--缺失关键字 转人工接通率(100%)(100%)
else (nvl(D.Counts,0)-nvl(E.Counts,0)) as 转人工失败次数
end
from
(select count(*) from *** )A left outer join
(select count(*) from *** )B left outer join
(select count(*) from *** )C left outer join
(select count(*) from *** )D left outer join
(select count(*) from *** )E left outer join

错误为 在 case
when nvl(D.Counts,0)=0 then as--缺失关键字 转人工接通率(100%)(100%)
taikongxinke 2011-04-11
  • 打赏
  • 举报
回复
把问题说明白吧!都不知道你是哪个地方报错。
加载更多回复(7)

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧