【发布时间】:2012-02-05 10:24:26
【问题描述】:
我有一个包含列的表:MONTH、YEAR、PROJECT_ID、STATUS。
状态可以是:
- R(红色)。
- A(琥珀色)。
- G(绿色)。
- N(未开始)。
- C(已完成)。
我想知道在给定月份内完成了多少项目,即:
where STATUS changed from anything that is NOT C to C;
听起来很简单……!
很容易找到任何给定项目的完成时间:
SELECT TOP 1 MONTH,YEAR,PROJECT_ID FROM Table WHERE PROJECT_ID=9236 AND RAG='C'
ORDER BY YEAR ASC, MONTH ASC
但鉴于year = 2011 和month = 8(例如),我不知道如何找到当月第一次拥有status='C' 的项目数量。有什么想法吗?
编辑: 项目在完成后仍然包含在带有status='C' 的行中,因此我不能只计算 Cs,因为这将返回本月和前几个月完成的项目数(因此按时间顺序排列并选择前 1 个)。
2010 年 10 月至 2011 年 1 月的示例数据:
Month | Year | Project | Status
-------------------------------
10 | 2010 | A | G
11 | 2010 | A | C
12 | 2010 | A | C
1 | 2011 | A | C
10 | 2010 | B | R
11 | 2010 | B | R
12 | 2010 | B | R
1 | 2011 | B | R
10 | 2010 | C | G
11 | 2010 | C | G
12 | 2010 | C | G
1 | 2011 | C | C
10 | 2010 | D | A
11 | 2010 | D | C
12 | 2010 | D | C
1 | 2011 | D | C
^ 项目 A 和 D 已于 11/2010 完成。在所示的四个月中的任何一个月内,项目 B 都没有更改为完成。项目 C 于 01/2011 完成。 {Month,Year,Project} 是主键。
因此,输入和输出将是:
10/2010 => 0
11/2010 => 2 (because of A and D)
12/2010 => 0
1/2011 => 1 (because of C)
【问题讨论】:
-
你说的那个月第一次是什么意思??你为什么不直接查询:
select count(*) from tablename where year = 2011 and month = 8 and status = 'C' -
应该阅读:...第一次有 status='C',即项目在那个月完成。您的查询会给我已完成项目的数量,而不是当月完成的项目数量。项目即使在完成后也包括在未来几个月内,状态仍然等于“C”。抱歉,还有很多我本来可以更清楚的!
-
能否提供一些数据样本(不一定是真实数据)和预期结果?它会让你的问题更清楚
-
好主意 - 刚刚添加。谢谢!
标签: sql sql-server count