pl/sql:函数

Posted

技术标签:

【中文标题】pl/sql:函数【英文标题】:pl/sql: Functions 【发布时间】:2012-09-04 12:54:39 【问题描述】:

我在 excel 表中有三列值

  A: # of unsuccessful transfers to CCR  (CTI) =11986
  B: # of calls NOT wrapped =8585
  C: # of wrapped calls= 15283

三列的总和是来电数 (CTI)= 37017(这是已打包的呼叫数 + 到 CCR 的不成功转移数 (CTI) + 未打包的呼叫数)

我还计算了未计入呼叫的数量(这是已打包呼叫数的减法 - 向 CCR (CTI) 的不成功转移数 - 未打包的呼叫数)

所以我的未计入电话数 = 1163

现在我必须找出未计数电话的百分比,所以我将 37017/1163 相除

所以我的百分比是 3%,理想情况下应该是 0%,我如何在 oracle 中找出 3% 中的百分比落在 A、B 或 C 中。

【问题讨论】:

转接到 CCR (CTI) 的失败次数 =11986 未打包的呼叫数 =8585 已打包的呼叫数 = 15283 A+B+C=35854。您似乎在说 A+B+C 应该 是 37017,但您没有说为什么,或者这个更大的数字来自哪里。然后,您会发现该明显任意数字与实际数字之间的差异是 1163,但我只能假设您必须首先知道要获得 37017。为什么那个“落入”A、B 或 C 的任何部分,以及怎么会有人知道它会如何在它们之间分裂?这与 Oracle 或 PL/SQL 有什么关系? 抱歉混淆 37017 来自数据库 select qry select count(distinct switch_id) from xx_new.xx_cti_call_details@appsread.prd.com where Dealer_name = 'XYG' and TRUNC(CREATION_DATE) BETWEEN '01- 2012 年 7 月和 2012 年 7 月 31 日 那么 A、B 和 C 在它们出现在 Excel 中之前从哪里来——也来自对相同数据的查询?如果是这样,您需要显示所有查询和数据结构(请在问题中,而不是在 cmets 中)。如果数据之间没有联系,那么这似乎不是一个可以回答的问题。 A) 11986/37017 的差异 =32.38% B) 8585/37017 的差异 =23.19% C) 15283/37017 的差异 =28.19% 最终数字 1163/37017 的差异 =3% In oracle 有没有办法找出它为什么不属于 A B 或 C 【参考方案1】:

A B C 来自数据库 qry,来源相同但一堆 A B 和 C 的每个 qry 的不同过滤器

这可能允许您在任何 A、B 或 C 都没有选择的行中发现一个模式,但您仍然需要计算出您期望每行(或模式)的三个查询中的哪一个行数)已被拾取,以及为什么它们被遗漏。

由于具有附加过滤器的三个查询的计数总和低于没有这些过滤器的查询的计数,因此您似乎在过滤器本身存在差距。如果我不得不猜测,那么我首先要寻找的是对null 值的错误处理,试图将它们等同于(since null is neither equal or not equal to anything, even itself)。但这显然是推测,如果不查看过滤器并且不知道哪些列可以为空,这并不是很有帮助。

您可以通过使用minus 来隔离未显示的 1163 行,以查找由“总”查询拾取且未包含在任何生成 A、B 和 C 的行中的行;类似:

select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
minus
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
and <additional filters for A>
minus
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
and <additional filters for B>
minus
select *
from xx_new.xx_cti_call_details@appsread.prd.com
where dealer_name = 'XYG'
and TRUNC(CREATION_DATE) BETWEEN '01-JUL-2012' AND '31-JUL-2012'
and <additional filters for C>

我很好奇您在初始查询中是否有 distinct,因为它表明您计算的是 switch 调用来自而不是调用本身。这也可能意味着计数不应该加起来——尽管在这种情况下,我可能期望 A+B+C 比简单的要大,因为可能存在重叠——并且select * 实际上可能返回超过1163行;在这种情况下,您可能只想选择您认为可能有问题的列。

顺便说一句,如果creation_date 被索引,那么使用where creation_date &gt;= date '2012-07-01' and creation_date &lt; date '2012-08-01' 可能会获得更好的性能,因为trunk() 函数会阻止索引被使用。不过对你来说可能不是问题。

【讨论】:

以上是关于pl/sql:函数的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL编程_概述

PL/SQL自定义函数

PL/Sql 函数

PL/SQL 函数参数

过程或函数 (Pl/sql)

从文件执行 PL/SQL 函数