【发布时间】:2014-05-25 14:33:18
【问题描述】:
我有下表:
+-------------+---------------------+---------------------+
| status | open_time | close_time |
+-------------+---------------------+---------------------+
| closed | 01-11-2014 19:32:44 | 01-11-2014 20:32:44 |
| open | 01-12-2014 22:33:49 | 02-12-2014 22:33:49 |
| open | 01-23-2014 22:08:24 | 03-23-2014 22:08:24 |
| closed | 02-01-2014 22:33:57 | 03-01-2014 22:33:57 |
| open | 02-01-2013 22:37:34 | 02-01-2013 23:37:34 |
| closed | 04-20-2013 15:23:00 | 05-20-2013 15:23:00 |
| open | 04-20-2013 12:21:49 | 05-20-2013 12:21:49 |
| closed | 04-25-2013 11:22:00 | 06-25-2013 11:22:00 |
| closed | 05-20-2013 14:23:49 | 10-20-2013 14:23:49 |
| closed | 04-20-2013 16:33:49 | 04-25-2013 16:33:49 |
+-------------+---------------------+---------------------*
我想展示这个结果:
+-------------+---------------+--------------+---------+
| Year | Month | Opened Cases | Closed Cases | Backlog |
+-------------+---------------+--------------+---------+
| 2014 | 4 | 10 | 5 | 62 | (57 + 5)
| 2014 | 3 | 9 | 7 | 57 | (52 + 2)
| 2014 | 2 | 15 | 20 | 52 | (57 - 5)
| 2014 | 1 | 12 | 1 | 57 | (46 + 11)
| 2013 | 12 | 10 | 9 | 46 | (45 + 1)
| 2013 | 11 | 50 | 5 | 45 | (45)
+--------------+--------------+--------------+---------+
其实我面临两种情况:
-
情况 #1:我无法为 Closed Cases 获得正确的值。尝试使用 where 中的子句,但没有成功。
-
情况 #2:在检索 Closed Cases 之后,我应该执行 (Opened - Closed) 并在几个月内累积,所以这将是积压。
对于情况 #1:
如果我执行以下选择:
SELECT
YEAR(open_time) AS Ano,
MONTH(open_time) AS Mes,
sum(CASE WHEN DATEPART(YYYY, open_time)= 2013 AND DATEPART(MM, open_time)= 11 THEN 1 ELSE 0 END) Abertos,
sum(CASE WHEN DATEPART(YYYY, close_time)= 2013 AND DATEPART(MM, close_time)= 11 THEN 1 ELSE 0 END) Fechados
FROM
TABLE
WHERE
GROUPDESC= 'SUPPORT'
GROUP BY
MONTH(open_time),
YEAR(open_time)
ORDER BY
Ano DESC,
Mes DESC
我明白了(这是已结案的正确值):
+-------------+---------------+--------------+
| Year | Month | Opened Cases | Closed Cases |
+-------------+---------------+--------------+
| 2014 | 4 | 0 | 0 |
| 2014 | 3 | 0 | 0 |
| 2014 | 2 | 0 | 0 |
| 2014 | 1 | 0 | 0 |
| 2013 | 12 | 0 | 0 |
| 2013 | 11 | 50 | 5 |
+--------------+--------------+--------------+
但如果我这样做:
SELECT
YEAR(open_time) AS Ano,
MONTH(open_time) AS Mes,
sum(CASE WHEN DATEPART(YYYY, open_time)= YEAR(open_time) AND DATEPART(MM, open_time)= MONTH(open_time) THEN 1 ELSE 0 END) Abertos,
sum(CASE WHEN DATEPART(YYYY, close_time)= YEAR(close_time) AND DATEPART(MM, close_time)= YEAR(close_time) THEN 1 ELSE 0 END) Fechados
FROM
TABLE
WHERE
GROUPDESC= 'SUPPORT'
GROUP BY
MONTH(open_time),
YEAR(open_time)
ORDER BY
Ano DESC,
Mes DESC
我明白了:
+-------------+---------------+--------------+
| Year | Month | Opened Cases | Closed Cases |
+-------------+---------------+--------------+
| 2014 | 4 | 0 | 0 |
| 2014 | 3 | 0 | 0 |
| 2014 | 2 | 0 | 0 |
| 2014 | 1 | 0 | 0 |
| 2013 | 12 | 0 | 0 |
| 2013 | 11 | 50 | 50 |
+--------------+--------------+--------------+
【问题讨论】:
-
所需结果表的积压列,第 2014.3 行显示 57。它应该是 54 = 52 + 2。
标签: sql sql-server select group-by