Oracle SQL:每个错误代码的错误计数错误

Posted

技术标签:

【中文标题】Oracle SQL:每个错误代码的错误计数错误【英文标题】:Oracle SQL : Wrong error count per error code 【发布时间】:2015-07-27 12:35:04 【问题描述】:

我正在尝试运行一个 SQL 查询以从数据库中找出每个错误代码的计数。我有两张桌子

    sw_sms_events 存储发送的事务 ID 和短信。 sw_events 其中事务 ID 和错误原因,如果失败则存储,否则原因始终为“成功发送 TariffText”。

错误总数:- select count(*) from sw_sms_events where sms_text like '%Welkom in het buitenland%'

每个错误原因的错误总数:-

select distinct count(*) over (partition by b.reason) , b.reason 
from sw_sms_events a, sw_events b 
where a.transaction_id= b.transaction_id  
and a.sms_text like '%Welkom in het buitenland%' 
and b.reason !='Successfully Sent TariffText'  
order by (count(*) over (partition by b.reason)) desc

通常,这些查询会给出相同的结果,即单个错误计数的总和 = 错误总数。但在最坏的情况下,同一事务被多次重试,结果并不相同。即我们在表中有多个具有相同事务 ID 的行。

以下是最坏情况下的结果之一:

Name    24-07-2015
Total Number of SMSWelcome Sent 156788
Total Number of Error SMSWelcome    1738
Total Number of SMSWelcome Sent with null Tariffs   286



Error Reason    Error Count

Unknown error received :BEA-380000 , ErrorMessage : BSL-99999   1829
Backend system not available , ErrorMessage : BSL-50002 641
Remote Error    527

NativeQuery.executeQuery failed , ErrorMessage : BSL-11009  41
This service is available only for active products , ErrorMessage : BSL-15024   30

Unknown error received :BEA-382556 , ErrorMessage : BSL-99999   18

Customer information: Not retrieved. This action cannot continue without customer information. Please try later or contact your system administrator. , ErrorMessage : BSL-10004    13

OMS login failure: Problem in OMS UAMS login - Nested Exception/Error: java.net.ConnectException: Tried all: '1' addresses, but could not connect over HTTP to server: '195.233.102.177', port: '40123' ,   12

t3://195.233.102.171:30101: Bootstrap to: 195.233.102.171/195.233.102.171:30101' over: 't3' got an error or timed out , ErrorMessage : BSL-11000    5
getTariffsAndAddOns, status: Failure , ErrorCode : An internal error occured , ErrorMessage : BSL-14005 3

Authorization failed of dealer market restrictions , ErrorMessage : BSL-50005   2

com.amdocs.cih.exception.InvalidUsageException: The input parameter AssignedProductRef is invalid. , ErrorMessage : BSL-10004   1

我的问题是我如何修改当前的 sql,使得当我们遇到同一事务在表中多次出现的情况时,错误的总计数应始终等于单个错误计数的总和

【问题讨论】:

问题在最后更新 【参考方案1】:

我真的不明白您为什么要使用分析查询。更简单的group by 还不够吗?

select count(*), b.reason 
from sw_sms_events a, sw_events b 
where a.transaction_id= b.transaction_id  
and a.sms_text like '%Welkom in het buitenland%' 
and b.reason !='Successfully Sent TariffText'  
group by b.reason
order by count(*) desc

当您说我们在表中有多个具有相同事务 ID 的行时,您是指仅在 sw_events 表中还是在 sw_sms_eventssw_events 表中?

如果是这样,则会多次计算事件,因为您正在使用相同的 transaction_id 对所有原始数据进行笛卡尔积。您应该使用更严格的连接子句。

你也可以做一些(相当丑陋的)比如:

select count(distinct b.ROWID), b.reason 
from sw_sms_events a, sw_events b 
where a.transaction_id= b.transaction_id  
and a.sms_text like '%Welkom in het buitenland%' 
and b.reason !='Successfully Sent TariffText'  
group by b.reason
order by count(distinct b.ROWID) desc

确保每个事件只计算一次。

【讨论】:

使用分析查询的主要原因是性能,你的同一个查询用了 30 多秒,而我的只用了 4-7 秒左右。 有趣,我不知道为什么,他们基本上做相同的数据访问和排序。如果您在查询中将 count(*) 的两个出现都替换为 count(distinct b.ROWID) 会发生什么?它解决了计数错误吗? 是的,使用 count(distinct b.ROWID) 可以正常工作。 :) 我已经将问题标记为已回答,并且也回答了我的问题。【参考方案2】:
select distinct count(distinct b.ROWID) over (partition by b.reason) , b.reason 
from sw_sms_events a, sw_events b 
where a.transaction_id= b.transaction_id  
and a.sms_text like '%Welkom in het buitenland%' 
and b.reason !='Successfully Sent TariffText'  
order by (count(distinct b.ROWID) over (partition by b.reason)) desc

【讨论】:

以上是关于Oracle SQL:每个错误代码的错误计数错误的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 过程中的错误计数(*)

使用 JDBC 的 Oracle 临时表计数错误

python3 UnicodeEncodeError错误,cx_oracle模块执行sql报错:UnicodeEncodeError: 'ascii' codec can't

oracle中怎么获得sql语句的错误信息

Mybatis 批量更新 ORA-00911: 无效字符的错误

Teradata SQL:计算错误代码连续出现的次数(并在不发生时重置)