如何使用SQL计算累计总数

时间:2019-01-12 19:27:41

标签: sql sql-server tsql

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

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用条件计数。

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

答案 2 :(得分:0)

您只需要group by statuscount每个组中的票数:

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

答案 3 :(得分:0)

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

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

致谢

答案 4 :(得分:0)

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

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;