Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅统计每个月的活动记录_Sql_Sql Server_Join_Count - Fatal编程技术网

Sql 仅统计每个月的活动记录

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

我创建了一个临时“任务”表,名为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
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];