查找成功和失败记录的总数

时间:2021-06-15 15:41:59

标签: sql database

我必须制定 SQL 查询来显示总成功和失败的设备处理。 假设用户选择 2 个设备并运行一些进程。 用户触发的每个进程将产生 4 个作业(1 个设备有 2 个作业要运行)。由于这里用户选择了 2 个设备,因此 db 中有 4 条记录。现在,根据 ParentTaskId,我需要显示设备总数中成功、失败的作业总数。

只有当两个作业(类型 1、类型 2)都成功时,我们才将设备上的作业视为成功。

注意:如果jobtype 1失败,jobtype 2不会触发

Ex:

Case 1:
ParentTaskId    DeviceId    TaskType    TaskStatus
101             a123         1          Success
101             a123         1          Success
101             a124         2          Success
101             a124         2          Success

Output : 
ParentTaskId    Success     Failed      TotalDevices
101              2           0              2

Case 2:
ParentTaskId    DeviceId    TaskType    TaskStatus
101             a123         1          Success
101             a123         1          Success
101             a124         2          Failed
101             a124         2          Success

Output:
ParentTaskId    Success     Failed      TotalDevices
101              1           1              2   

尝试了以下方法但没有成功:

select
ParentTaskId,
COUNT(DISTINCT(DeviceId)),
count( case when TaskStatus='SUCCESS' then 1 end) as Success,
count( case when TaskStatus!='SUCCESS' then 1 end) as Failed
from XYZ 
where ParentTaskId = '101'
group by ParentTaskId,DeviceId

对此有任何指示/建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用两个级别的聚合 - 内部级别用于获取每个父级和设备的状态。为此,您实际上可以使用 min(taskStatus) 来获取状态:

select ParentTaskId,
       sum(case when taskStatus = 'Success' then 1 else 0 end) as success,
       sum(case when taskStatus = 'Failed' then 1 else 0 end) as failed,
       count(*) as total
from (select ParentTaskId, deviceId, min(taskStatus) as taskStatus
      from t
      group by ParentTaskId, deviceId
     ) pd
group by ParentTaskId;
相关问题