Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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_Tsql_Date Range - Fatal编程技术网

SQL-计数日期速率内活动的项目数

SQL-计数日期速率内活动的项目数,sql,sql-server,tsql,date-range,Sql,Sql Server,Tsql,Date Range,我有一个由资源、项目、开始日期和结束日期组成的数据集。 每种资源都可以被多个项目利用 我想统计每个季度使用资源的项目数量 所以,如果项目开始于某一年的第一季度,结束于该年的第三季度,而项目2开始于第二季度,结束于第三季度,我想统计第二季度的2个项目,因为在第一季度期间,项目1和项目2都处于活动状态 这是我的数据集: create table Projects (Resource_Name varchar(20) ,Project_Name varchar(20) ,StartDate varch

我有一个由
资源
项目
开始日期
结束日期
组成的数据集。 每种资源都可以被多个项目利用

我想统计每个季度使用资源的项目数量

所以,如果项目开始于某一年的第一季度,结束于该年的第三季度,而项目2开始于第二季度,结束于第三季度,我想统计第二季度的2个项目,因为在第一季度期间,项目1和项目2都处于活动状态

这是我的数据集:

create table Projects
(Resource_Name varchar(20)
,Project_Name varchar(20)
,StartDate varchar(20)
,EndDate varchar(20)
)


insert into Projects values('Resource 1','Project A','15/01/2013','1/11/2014')
insert into Projects values('Resource 1','Project B','1/03/2013','1/09/2016')
insert into Projects values('Resource 1','Project C','1/04/2013','1/09/2015')
insert into Projects values('Resource 1','Project D','1/06/2013','1/03/2016')
insert into Projects values('Resource 1','Project E','15/01/2013','1/09/2015')
insert into Projects values('Resource 1','Project F','3/06/2013','1/11/2015')
下面是我想要的结果:

Resource Name| Year | Quarter|Active Projects
Resource 1     2013     1           2
Resource 1     2013     2           6

您可以通过确定项目处于活动状态时的第一个季度和最后一个季度,然后使用累计总和来实现这一点。在SQL Server 2012+中,如下所示

select resource_name, yyyyq, 
       (sum(sum(s)) over (partition by resource_name order by yyyyq) -
        sum(sum(e)) over (partition by resource_name order by yyyyq) +
        e
       ) as activeProjects
from ((select resource_name, datepart(year, startdate) + datepart(quarter, startdate) as yyyyq, 1 as s, 0 as e
       from projects
      ) union all
      (select resource_name, datepart(year, enddate) + datepart(quarter, enddate), 0 as s, 1 as e
       from projects
      )
     ) yq
group by resource_name, yyyyq;
在早期版本中,您可以使用计数表执行与交叉应用类似的操作:

使用
项目的日期
,生成所有季度及其开始日期和结束日期的列表,在本例中,即
CteQuarter(sd,ed)
。之后,您只需将
项目
加入到
CteQuarter
中,以获得重叠的日期。最后,
使用日期的
季度
部分按
分组


问:
DATEADD(YEAR,cy.yr-1900,0)
做什么?获取一年的第一天
cy.yr
。好的,但是为什么需要1900?因为日期
0
意味着
1900-01-01
。我知道他做了什么。还不知道怎么做。首先,列出涵盖数据的
年份列表。然后用开始日期和结束日期将所有这些年分成
季度。检查每个
季度
,查看有多少项目在该
季度
WITH CteYear(yr) AS(
    SELECT number
    FROM master..spt_values
    WHERE 
        type = 'P'
        AND number >= (SELECT MIN(YEAR(CONVERT(DATE, StartDate, 103))) FROM Projects)
        AND number <= (SELECT MAX(YEAR(CONVERT(DATE, EndDate, 103))) FROM Projects)
),
CteQuarter(sd, ed) AS(
    SELECT
        DATEADD(QUARTER, q.n - 1, DATEADD(YEAR, cy.yr - 1900, 0)),
        DATEADD(DAY, -1, DATEADD(QUARTER, q.n, DATEADD(YEAR, cy.yr - 1900, 0)))
    FROM CteYear AS cy
    CROSS JOIN(
        SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
    ) AS q(n)
)
SELECT 
    p.Resource_Name,
    [Year] = DATEPART(YEAR, q.sd),
    [Quarter] = DATEPART(QUARTER, q.sd),
    [Active Projects] = COUNT(*)
FROM Projects p
INNER JOIN CteQuarter q
    ON CONVERT(DATE, StartDate, 103) <= q.ed
    AND CONVERT(DATE, EndDate, 103) >= q.sd
GROUP BY 
    p.Resource_Name,
    DATEPART(YEAR, q.sd),
    DATEPART(QUARTER, q.sd)
ORDER BY
    p.Resource_Name,
    DATEPART(YEAR, q.sd),
    DATEPART(QUARTER, q.sd)
| Resource_Name | Year | Quarter | Active Projects |
|---------------|------|---------|-----------------|
|    Resource 1 | 2013 |       1 |               3 |
|    Resource 1 | 2013 |       2 |               6 |
|    Resource 1 | 2013 |       3 |               6 |
|    Resource 1 | 2013 |       4 |               6 |
|    Resource 1 | 2014 |       1 |               6 |
|    Resource 1 | 2014 |       2 |               6 |
|    Resource 1 | 2014 |       3 |               6 |
|    Resource 1 | 2014 |       4 |               6 |
|    Resource 1 | 2015 |       1 |               5 |
|    Resource 1 | 2015 |       2 |               5 |
|    Resource 1 | 2015 |       3 |               5 |
|    Resource 1 | 2015 |       4 |               3 |
|    Resource 1 | 2016 |       1 |               2 |
|    Resource 1 | 2016 |       2 |               1 |
|    Resource 1 | 2016 |       3 |               1 |