Sql 仅统计每个月的活动记录
我创建了一个临时“任务”表,名为CFTasks,如下所示:Sql 仅统计每个月的活动记录,sql,sql-server,join,count,Sql,Sql Server,Join,Count,我创建了一个临时“任务”表,名为CFTasks,如下所示: ID STARTDATE ENDDATE 1712060019 06/12/2017 07/12/2017 1712060019 07/12/2017 07/12/2017 1712060019 08/12/2017 08/12/2017 1712060019 07/12/2017 08/12/2017 1712060019 07/12/2017 12/12/2017 1
ID STARTDATE ENDDATE
1712060019 06/12/2017 07/12/2017
1712060019 07/12/2017 07/12/2017
1712060019 08/12/2017 08/12/2017
1712060019 07/12/2017 08/12/2017
1712060019 07/12/2017 12/12/2017
1712060019 12/12/2017 13/12/2017
1712060019 14/12/2017 14/12/2017
1712060019 07/12/2017 14/12/2017
1712060019 14/12/2017 NULL
1712060019 07/12/2017 14/12/2017
1712060019 18/12/2017 21/12/2017
1712060019 18/12/2017 21/12/2017
1712060019 19/12/2017 21/12/2017
1712060019 02/11/2018 24/09/2018
1712060019 14/09/2018 24/09/2018
1712060019 13/10/2018 05/12/2018
1712060019 13/10/2018 05/12/2018
1712060019 12/11/2018 05/12/2018
1712060019 19/12/2018 07/12/2018
1712060019 13/12/2018 07/12/2018
从2017年12月1日到本月的每个月,我想知道这些记录中有多少是活动的,我的意思是[STARTDATE]小于或等于该月的第一个,并且[ENDDATE]大于该月的第一个,或者[ENDDATE]为空
i、 e
[DUEDATE]=@StartOfMonth
或[ENDDATE]为空
对于提供的示例任务表,我希望输出如下所示:
Month ActiveTasks
01/12/2017 0
01/01/2018 1
01/02/2018 1
01/03/2018 1
01/04/2018 1
01/05/2018 1
01/06/2018 1
01/07/2018 1
01/08/2018 1
01/09/2018 1
01/10/2018 1
01/11/2018 3
01/12/2018 4
我还创建了一个日期表,这样即使在某个特定的报告日期没有活动任务,我也可以得到一个计数,但是我找不到一种方法来连接这两个表以获得所需的结果
我的日期表是这样创建的:
DROP TABLE IF EXISTS #CalendarMonths
DECLARE @StartDate date
SELECT @StartDate = '20171201';
DECLARE @CutoffDate date = getdate()
;WITH seq(n) AS
(
SELECT 0 UNION ALL SELECT n + 1 FROM seq
WHERE n < DATEDIFF(MONTH, @StartDate, @CutoffDate)
),
m(m) AS
(
SELECT DATEADD(MONTH, n, @StartDate) FROM seq
)
SELECT m AS [Month]
INTO #CalendarMonths
FROM m
ORDER BY m
OPTION (MAXRECURSION 0);
如果需要支持空结束日期,则只需调整查询:
SELECT cm.[Month],
COUNT(cft.ID) AS TasksDue
FROM #CalendarMonths cm LEFT JOIN
#CFTasks cft
ON cft.STARTDATE <= cm.[Month] AND
( cft.ENDDATE > cm.[Month] OR cft.ENDDATE IS NULL )
GROUP BY cm.[Month]
ORDER BY cm.[Month];
在我看来,您的查询是正确的。ENDDATE为NULL时如何?将示例数据粘贴为文本比image@JohnCappelletti那更好吗?@MLucas好多了!谢谢你,你的解决方案是绝对正确的,令人气愤的是,我在发帖之前已经亲自尝试过了。遗憾的是,当我对照另一个现有查询检查给定月份的结果时,两个输出不匹配,结果证明我的新查询不是问题所在!
SELECT cm.[Month],
COUNT(cft.ID) AS TasksDue
FROM #CalendarMonths cm LEFT JOIN
#CFTasks cft
ON cft.STARTDATE <= cm.[Month] AND
( cft.ENDDATE > cm.[Month] OR cft.ENDDATE IS NULL )
GROUP BY cm.[Month]
ORDER BY cm.[Month];