使用SQL在特定时间计算特定状态的案例

时间:2009-10-19 12:36:00

标签: sql-server tsql sql-server-2000

我需要开发一个查询,计算每月“开放”案例的总数。 我有一个带有id和名称的'cases'表,以及一个带有datetime列,caseid列和状态的'state_changes'表。

如何计算过去每个月都有“开放”状态记录的案例数量,但没有关闭状态的相应记录?

我正在使用SQL Server 2000。

2 个答案:

答案 0 :(得分:2)

这应该让你关闭(T-SQL):

SELECT
  MONTH(s.casedate) m,
  YEAR(s.casedate)  y,
  COUNT(DISTINCT c.caseid)   count_cases
FROM
  cases c
  INNER JOIN state_changes s ON s.caseid = c.caseid
WHERE
  s.state = 'open'           /* "with state 'open'" */
  AND s.casedate < GETDATE() /* "in the past" */
  AND NOT EXISTS (           /* "without corresp. record with state 'closed'" */
    SELECT 1 FROM state_changes i WHERE i.caseid = s.caseid AND i.state = 'closed'
  )
GROUP BY
  MONTH(s.casedate),
  YEAR(s.casedate)

编辑:要对所有十二个月进行统计(独立于这几个月中存在的实际案例),您需要一个小帮助表(我们称之为month),它只包含一列(让我们称之为{1}}以及从1到12的数字。然后你加入反对它:

month

答案 1 :(得分:1)

创建开放事件的状态更改表和关闭事件的状态更改表的查询。

创建一个查询,在案例ID上执行open到close的外部联接,从两个查询中返回案例ID

查询后面的查询结果,查看“close”事件查询中的ID为空的行

计算后一个查询结果中的行数。

非常喜欢的东西(在我的头顶,没有更正):

SELECT COUNT (T1.CaseID) FROM (SELECT T1.CaseID AS T1_CaseID, T2.CaseID AS T2_CaseID 
FROM ((SELECT CaseID FROM state_changes WHERE state = 'open' AND timestamp BETWEEN 1-Jan-09 AND 30-Jan-09) AS T1 OUTER JOIN (SELECT CaseID FROM state_changes WHERE state = 'closed' AND timestamp BETWEEN 1-Jan-09 AND 30-Jan-09) AS T2 ON T1.CaseID = T2.CaseID)) WHERE T2_CaseID = NULL