我需要开发一个查询,计算每月“开放”案例的总数。 我有一个带有id和名称的'cases'表,以及一个带有datetime列,caseid列和状态的'state_changes'表。
如何计算过去每个月都有“开放”状态记录的案例数量,但没有关闭状态的相应记录?
我正在使用SQL Server 2000。
答案 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