首页 > 解决方案 > 值范围内记录的计数和百分比

问题描述

我有一个有列的表

TicketID - ID of the ticket
AssignedTo - UserID of person to whom ticket is assigned
CreatedTime - Time when Ticket is received
HandleTime - Time when Ticket is picked up for handling
FinishTime - Time when Ticket is finished handling

我需要检索以下分组到各个 AssignedTo ID 的数据:

我想出了一个初始查询

SELECT 
   User,
   sum(case when PickupTime <=1 then 1 else 0 end) as range1,
   sum(case when PickupTime <=2 then 1 else 0 end) as range2,
   ...
FROM
   (SELECT 
      ((HandleTime - CreatedTime)/60000) as PickupTime, 
      ((FinishTime - CreatedTime)/60000) as CompletedTime,
      AssignedTo as User 
    FROM 
      TicketTable
    )T
GROUP BY 
    User

在这里,我只能获得皮卡范围计数。我仍然需要皮卡范围百分比以及收盘范围计数和百分比。我如何获得它们?

编辑:

让我们考虑一个样本数据集,只有两个范围 <=1 和 >1,并且在这里直接将时间视为分钟,而在原始表中,它存储为时间戳。

TicketID | AssignedTo | CreatedTime | HandleTime | FinishTime
   1          001          2              3           3
   2          001          4              6           8
   3          002          1              2           3

在上表中,用户 001 总共分配了 2 张票,而用户 002 总共分配了 1 张票。门票的 PickupTime 和 CompletedTime 是

TicketID | PickupTime | CompletedTime
    1          1            1
    2          2            4
    3          1            2

因此,对于分配给他的两张票中的 User-001,他选择了 1 分钟范围内的一张票和 1 一张大于 1 分钟范围的票。因此,1 分钟范围内的票的百分比是 50%,超过 1 分钟范围的票是 50%对他来说。同样适用于 CompletedTime 和 User-002。所以我想要的最终结果是。

AssignedTo | Pickup_range1_count | Pickup_range2_count | Pickup_range1_percentage | 
001           1                       1                     0.5 
002           1                       0                     1        
Pickup_range2_percentage | Complete_range1_count | Complete_range2_count |
         0.5                       1                  1
         0                         0                  1
Complete_range1_percentage | Complete_range2_percentage 
          0.5                       0.5
          0                         1

标签: mysqlsqldatabase

解决方案


根据您的示例,您几乎已经掌握了它。您所需要的只是单个总和与总和的比率(或者计数会做到这一点)。就像是

SELECT AssignedTo,
       sum(1) AllCount,
       sum(CASE
             WHEN HandleTime - CreatedTime <= 1
               THEN 1
             ELSE 0
           END) Range1PickupCount,
       sum(CASE
             WHEN HandleTime - CreatedTime > 1
               THEN 1
             ELSE 0
           END) Range2PickupCount,
       ...
       sum(CASE
             WHEN HandleTime - CreatedTime <= 1
               THEN 1
             ELSE 0
           END) / sum(1) * 100 Range1PickupPercentage,
       sum(CASE
             WHEN HandleTime - CreatedTime > 1
               THEN 1
             ELSE 0
           END) / sum(1) * 100 Range2PickupPercentage,
       ...
       FROM Tickets
       GROUP BY AssignedTo;

应该是一个有效的演示,你可以继续。

(免责声明:根本没有经过测试,因为没有提供 DDL 和 DML。)


推荐阅读