Sql server 使用SQL统计特定时间处于特定状态的案例
我需要开发一个查询,该查询将统计每月“未结”案件的总数。 我有一个带有id和名称的“cases”表,还有一个带有datetime列、caseid列和state的“state\u changes”表 我如何计算每个月有“开放”状态记录但没有相应“关闭”状态记录的案例数量 我正在使用SQL server 2000。这应该可以让您接近(T-SQL): 这将使您接近(T-SQL):Sql server 使用SQL统计特定时间处于特定状态的案例,sql-server,tsql,sql-server-2000,Sql Server,Tsql,Sql Server 2000,我需要开发一个查询,该查询将统计每月“未结”案件的总数。 我有一个带有id和名称的“cases”表,还有一个带有datetime列、caseid列和state的“state\u changes”表 我如何计算每个月有“开放”状态记录但没有相应“关闭”状态记录的案例数量 我正在使用SQL server 2000。这应该可以让您接近(T-SQL): 这将使您接近(T-SQL): 为打开事件和关闭事件创建状态更改表查询 创建一个查询,对从两个查询返回案例ID的案例ID执行打开到关闭的外部联接 对于“c
为打开事件和关闭事件创建状态更改表查询 创建一个查询,对从两个查询返回案例ID的案例ID执行打开到关闭的外部联接 对于“close”事件查询的ID为空的行,查询后一个查询结果 计算后一个查询结果中的行数 非常粗略地说(从我的头顶上,没有纠正):
为打开事件和关闭事件创建状态更改表查询 创建一个查询,对从两个查询返回案例ID的案例ID执行打开到关闭的外部联接 对于“close”事件查询的ID为空的行,查询后一个查询结果 计算后一个查询结果中的行数 非常粗略地说(从我的头顶上,没有纠正):
视情况而定。未来的案例可能不是不可能的,既然OP明确提到了这一点……谢谢,我同意这一点。现在的问题是我需要知道每个月a的计数,这与案件日期的月份不同。当我有一些东西时,我会尝试更新。你需要一个从1到12的小帮助表,这样你就有了加入和分组的东西。这取决于。未来的案例可能不是不可能的,既然OP明确提到了这一点……谢谢,我同意这一点。现在的问题是我需要知道每个月a的计数,这与案件日期的月份不同。当我有一些东西时,我会尝试更新。你需要一个从1到12的小帮助表,这样你就有东西可以加入和分组。很好,虽然现在我必须弄清楚如何按月分组。虽然现在我必须弄清楚如何按月分组
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)
SELECT
m.month,
COUNT(DISTINCT c.caseid) count_cases
FROM
cases c
INNER JOIN state_changes s ON s.caseid = c.caseid
LEFT JOIN month m ON m.month = MONTH(s.casedate)
WHERE
s.state = 'open'
AND YEAR(c.createddate) = YEAR(GETDATE()) /* whatever */
AND NOT EXISTS (
SELECT 1 FROM state_changes i WHERE i.caseid = s.caseid AND i.state = 'closed'
)
GROUP BY
m.month
ORDER BY
m.month
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