【问题标题】:How can I get a count of Tickets Closed on a given day?我如何获得在给定日期关闭的门票数量?
【发布时间】:2015-07-31 19:26:56
【问题描述】:

我有一个存储工单状态变化的表。一些门票在关闭后重新打开。并且在某些情况下(下面的示例)会重新打开几次。

Ticket  SEQUENCE    NEWVALUE    OLDVALUE        TIMESTAMP
5879    15870       REQUEST     NULL        2015-06-10 12:13:28.000
5879    16256       Pending     REQUEST     2015-06-11 14:26:38.000
5879    21642       Open        Pending     2015-07-02 13:32:47.000
5879    21943       Pending     Open        2015-07-06 09:55:37.000
5879    23195       Open        Pending     2015-07-09 15:00:47.000
5879    24917       Pending     Open        2015-07-17 15:09:28.000
5879    25903       Closed      Pending     2015-07-22 11:13:03.000
5879    25940       Open        Closed      2015-07-22 12:56:05.000
5879    25972       Pending     Open        2015-07-22 13:54:30.000
5879    25996       Closed      Pending     2015-07-22 14:31:05.000
5879    26484       Pending     Closed      2015-07-24 14:43:28.000
5879    26776       Closed      Pending     2015-07-27 11:34:00.000

我正在尝试确定上次关闭工单的时间。但我什至不知道如何开始这个查询。有人可以提供线索吗?非常感谢!

我想要得到的最终结果是这样的:

Date        Tickets Submitted   Tickets Closed
2015-06-01      123                 44
2015-06-02      125                 45
2015-06-03      147                 51
2015-06-04      190                 58
2015-06-05      132                 38
2015-06-06      93                  28
2015-06-07      126                 30
2015-06-08      167                 50

我目前的查询是:

SELECT CAST(SUBMITDATE as date) as 'Date'

,COUNT(*) as [Tickets Submitted]
,SUM(CASE WHEN NEWVALUE = 'Closed' THEN 1 ELSE 0 END) as [Tickets Closed]

FROM dbo.MasterTable
FULL OUTER JOIN FIELDHISTORY
ON MasterTable.Ticket = FIELDHISTORY.Ticket

    WHERE SUBMITDATE >= '2015-06-01'
        AND SUBMITDATE < '2015-06-08'

GROUP BY CAST(SUBMITDATE as date)
ORDER BY CAST(SUBMITDATE as date)

这个查询的问题是它没有显示在那个特定日期关闭了多少票。它仅显示在特定日期打开的票证池中关闭的票证数量。换句话说,从上面的示例中,2015 年 6 月 1 日,创建了 123 个工单,其中 44 个工单目前已关闭。如果有人要关闭 6 月 1 日创建的另一张工单,则 44 个已关闭工单的数字可能会发生变化。

希望这不会太混乱! =D

【问题讨论】:

  • 您的结果应该是什么样的?
  • 你试过什么?如果一张票被关闭并重新打开而不是再次关闭怎么办?你还在数吗?
  • 如果一张票被关闭然后重新打开..并且当前仍然打开,则不能算作关闭。
  • 你能显示整个架构吗?您显示一个表,但在您的查询中还有其他表。

标签: sql sql-server-2012 ticket-system


【解决方案1】:

假设:

为了将工单视为已关闭,最后一个状态必须为“已关闭”,并且工单不能从“已关闭”状态开始。你可以试试下面的SQL。

DECLARE @Ticket int = 5879;

SELECT [Timestamp] FROM [Table_Name]
WHERE Ticket=@Ticket AND NewValue = 'Closed'  
AND [Timestamp] = (SELECT Max([Timestamp]) FROM [Table_Name] WHERE Ticket=@Ticket)

[Table_Name] 将替换为您的表名。

【讨论】:

    【解决方案2】:

    根据您的更新,我相信这就是您所追求的。

    您可以使用row_number 窗口函数按票证/日期给出行#(我称之为rid)。然后你也可以按票/日期做一个count(我称之为tdc)。

    这是mycte 在我将其更改为countssums 之前的输出。

    actdt       ticket  sequence    newvalue    oldvalue    rid tdc
    2015-06-10  5879    15870       REQUEST     NULL        1   1
    2015-06-11  5879    16256       Pending     REQUEST     1   1
    2015-07-02  5879    21642       Open        Pending     1   1
    2015-07-06  5879    21943       Pending     Open        1   1
    2015-07-09  5879    23195       Open        Pending     1   1
    2015-07-17  5879    24917       Pending     Open        1   1
    2015-07-22  5879    25903       Closed      Pending     1   4
    2015-07-22  5879    25940       Open        Closed      2   4
    2015-07-22  5879    25972       Pending     Open        3   4
    2015-07-22  5879    25996       Closed      Pending     4   4
    2015-07-24  5879    26484       Pending     Closed      1   1
    2015-07-27  5879    26776       Closed      Pending     1   1
    

    根据您的信息,sequence=25996sequence=26776 是唯一可以算作实际结束的活动,因为这是当天的最后一个活动。请注意这里,rid=tdc

    如果这些值匹配的是一天中的最后一个事件,则是否应该在同一日期重新打开/处理票(您也可以使用反向 row_number 执行相同操作,但这为检查其他条件)。因此,您可以使用这两个新列来评估一个项目是否计为已关闭,但由于它是一个条件 count,因此您必须改为 sum 一个 0/​​1。

    输出:

    actdt       submitted   closed
    2015-06-10  1           0
    2015-06-11  1           0
    2015-07-02  1           0
    2015-07-06  1           0
    2015-07-09  1           0
    2015-07-17  1           0
    2015-07-22  4           1
    2015-07-24  1           0
    2015-07-27  1           1
    

    完整代码:

    create table mydata (ticket int, sequence int, newvalue varchar(25), oldvalue varchar(25), [timestamp] datetime)
    insert into mydata
    select 5879,15870,'REQUEST','NULL','2015-06-10 12:13:28.000' union
    select 5879,16256,'Pending','REQUEST','2015-06-11 14:26:38.000' union
    select 5879,21642,'Open','Pending','2015-07-02 13:32:47.000' union
    select 5879,21943,'Pending','Open','2015-07-06 09:55:37.000' union
    select 5879,23195,'Open','Pending','2015-07-09 15:00:47.000' union
    select 5879,24917,'Pending','Open','2015-07-17 15:09:28.000' union
    select 5879,25903,'Closed','Pending','2015-07-22 11:13:03.000' union
    select 5879,25940,'Open','Closed','2015-07-22 12:56:05.000' union
    select 5879,25972,'Pending','Open','2015-07-22 13:54:30.000' union
    select 5879,25996,'Closed','Pending','2015-07-22 14:31:05.000' union
    select 5879,26484,'Pending','Closed','2015-07-24 14:43:28.000' union
    select 5879,26776,'Closed','Pending','2015-07-27 11:34:00.000'
    
    ; with cte (actdt,ticket,sequence,newvalue,oldvalue,rid,tdc)
    as
    (
       select convert(date,[timestamp]), 
              ticket,
              sequence,
              newvalue,
              oldvalue,
              row_number() over(partition by ticket,convert(date,[timestamp]) order by sequence) as rid,
              count(2) over(partition by ticket,convert(date,[timestamp])) as tdc
       from mydata
    )
    
    select actdt,
           count(distinct sequence) as submitted,
           sum(case when newvalue='closed' and rid=tdc then 1 else 0 end) as closed
    from cte
    group by actdt
    

    如果我遗漏了什么,请告诉我,我可以根据需要进行更新。

    SQLFiddle

    【讨论】:

      【解决方案3】:

      从 TABLE_NAME 中选择 TIMESTAMP,其中 NEWVALUE 类似于 'Closed' 或 OLDVALUE 类似于 'Closed'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2022-11-09
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        相关资源
        最近更新 更多