【问题标题】:How to calculate a Cumulative total using SQL如何使用 SQL 计算累积总数
【发布时间】:2019-01-13 05:02:18
【问题描述】:

我的数据库中有一个Tickets 表,每张票都有一个status_id (1,2,3)

1:  Ticket IN PROGRESS
2:  Ticket Out Of time
3:  Ticket Closed 
  • 我想用SQL来计算每个状态的票数。

  • 计算每个状态在特定日期的累计总数,我已经有一列affectation_Date,其中包含工单状态更改的日期。

【问题讨论】:

  • 请提供样本数据和所需结果。
  • 到目前为止你尝试了什么?请编辑您的问题以将示例数据和预期结果发布为格式化文本而不是图像。
  • 另外,您想要一 (1) 个查询还是两 (2) 个查询?

标签: sql sql-server tsql


【解决方案1】:

使用条件聚合作为

SELECT TicketID,
       AffectationDate,
       SUM(CASE WHEN StatusID = 1 THEN 1 ELSE 0 END) InProgress,
       SUM(CASE WHEN StatusID = 2 THEN 1 ELSE 0 END) OuOfTime,
       SUM(CASE WHEN StatusID = 3 THEN 1 ELSE 0 END) Closed,
       COUNT(1) Total
FROM Tickets
GROUP BY TicketID,
         AffectationDate
ORDER BY TicketID,
         AffectationDate;

或者如果你只想GROUP BY AffectationDate

SELECT AffectationDate,
       SUM(CASE WHEN StatusID = 1 THEN 1 ELSE 0 END) TotalInProgress,
       SUM(CASE WHEN StatusID = 2 THEN 1 ELSE 0 END) TotalOutOfTime,
       SUM(CASE WHEN StatusID = 3 THEN 1 ELSE 0 END) TotalClosed,
       COUNT(1) TotalStatusThisDate
FROM Tickets
GROUP BY AffectationDate
ORDER BY AffectationDate;

Live Demo

【讨论】:

    【解决方案2】:

    使用条件计数。

    SELECT affectation_Date,
    COUNT(CASE WHEN status_id = 1 THEN 1 END) AS TotalInProgress,
    COUNT(CASE WHEN status_id = 2 THEN 1 END) AS TotalOutOfTime,
    COUNT(CASE WHEN status_id = 3 THEN 1 END) AS TotalClosed
    FROM Tickets t
    GROUP BY affectation_Date
    ORDER BY affectation_Date
    

    【讨论】:

      【解决方案3】:

      您可以对日期条件使用所需的过滤条件

      SELECT COUNT(1), STATUS 
      FROM tickets
      WHERE affectation_Date >= 'someDate'
      group by status
      

      问候

      【讨论】:

        【解决方案4】:

        你只需要group bystatuscount每组的票数:

        select status, count(*) as number
        from Tickets
        where dt >= '2019-01-01 00:00:00' and dt < '2019-01-02 00:00:00'
        group by status
        having status >= 1 and status <= 3
        

        【讨论】:

          【解决方案5】:

          这会将累积和添加到现有答案中:

          SELECT AffectationDate,
                 Sum(CASE WHEN StatusID = 1 THEN 1 ELSE 0 END) AS TotalInProgress,
                 Sum(CASE WHEN StatusID = 2 THEN 1 ELSE 0 END) AS TotalOutOfTime,
                 Sum(CASE WHEN StatusID = 3 THEN 1 ELSE 0 END) AS TotalClosed,
                 Count(*) as TotalStatusThisDate,
                 Sum(Sum(CASE WHEN StatusID = 1 THEN 1 ELSE 0 END)) Over (ORDER BY AffectationDate) AS cumTotalInProgress,
                 Sum(Sum(CASE WHEN StatusID = 2 THEN 1 ELSE 0 END)) Over (ORDER BY AffectationDate) AS cumTotalOutOfTime,
                 Sum(Sum(CASE WHEN StatusID = 3 THEN 1 ELSE 0 END)) Over (ORDER BY AffectationDate) AS cumTotalClosed,
                 Sum(Count(*)) Over (ORDER BY AffectationDate) AS cumTotalStatusThisDate
          FROM Tickets
          GROUP BY AffectationDate
          ORDER BY AffectationDate;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-07
            • 1970-01-01
            • 2020-05-11
            • 1970-01-01
            • 1970-01-01
            • 2016-05-11
            • 1970-01-01
            • 2017-10-05
            相关资源
            最近更新 更多