Tsql 一个T-SQL过程,用于确定所有“事件”的总持续时间或天数;个案;在指定的时间段内。这是一个挑战

Tsql 一个T-SQL过程,用于确定所有“事件”的总持续时间或天数;个案;在指定的时间段内。这是一个挑战,tsql,sql-server-2012,Tsql,Sql Server 2012,我真的需要一些帮助,并打算积极参与这个社区,反过来帮助其他人。在过去两年中,我是一名使用MS SQL Server的SQL开发人员,但在这方面我遇到了障碍。想象一下,您有许多“住宿提供商”。每个都有一定的“服务能力”。我们有一个数据集,其中包含多个并发“放置”,可以是从一天到几年的任意时间。我们希望通过计算得出“入住率” 入住率=安置天数(期间内所有安置的所有天数) / (容量x期间天数)x 100 我已经更改了字段/表的名称,并在这里显示一些虚构的示例数据 我们在表(tPL)中有一个数据集用于

我真的需要一些帮助,并打算积极参与这个社区,反过来帮助其他人。在过去两年中,我是一名使用MS SQL Server的SQL开发人员,但在这方面我遇到了障碍。想象一下,您有许多“住宿提供商”。每个都有一定的“服务能力”。我们有一个数据集,其中包含多个并发“放置”,可以是从一天到几年的任意时间。我们希望通过计算得出“入住率”

入住率=安置天数(期间内所有安置的所有天数) /
(容量x期间天数)x 100

我已经更改了字段/表的名称,并在这里显示一些虚构的示例数据

我们在表(tPL)中有一个数据集用于“放置”。有成千上万的记录,可以追溯到7年前

e、 g

除以服务能力是最简单的部分。我正在努力计算给定时间段(如一个月或一个季度)内“安置天数”的总数
如果你认为容纳1、2和3可以有多个同时和重叠的不同长度的放置,可以在任何时间开始和结束,那么我如何计算所有放置的总天数,即在给定的时间段(例如,四分之一个月或一个月)内的总天数,然后计算占用率?下面的代码是一个尝试。我假设这里的所有月份都是30天,我知道这是错误的。我知道计算天数的逻辑是错误的。老实说,我几乎完全崩溃了,我似乎无法完成这件事,因此我请求帮助

我加入约会桌是不是走错了方向?以前有人反对过吗。此外,如果您希望我向您提供更多信息或澄清,我很乐意这样做

我们将非常感谢您提供的任何帮助

请参阅下面的代码。我尝试过几种不同的方法,但遗憾的是没有保存旧版本来展示。但是,它们没有起作用。我过去也做过类似的事情,看看在任何给定的时间点有多少“未结案件”。这激发了这里的代码,并且是这样的:

SELECT        TOP (1000) tMY.Month_Year, COUNT(*) AS ActiveCases
FROM          tbl_Casework   AS tblCW LEFT OUTER JOIN
                         tbl_Month_Year AS tMY ON tMY.Month_Year >= tblCW.Start_Date AND tMY.Month_Year <= DATEADD(day, 31 - DATEPART(day, 
                         ISNULL(tblCW.End_Date, GETDATE())), ISNULL(tblCW.End_Date, GETDATE()))
GROUP BY tMY.Month_Year
选择前(1000)个tMY.Month\u Year,将(*)计算为活动案例
从tbl_案例工作,作为tblCW左外连接
tbl\u月\u年作为tMY在tMY.Month\u Year>=tblCW.Start\u日期和tMY.Month\u Year=0和
datediff(day,[tMY].[Month_Year],tPL.[空缺结束日期]=30和datediff(day,tPL.[空缺填补日期],[tMY].[Month_Year])=[空缺填补日期]和tMY.MonthYear='20160501'和tMY.MonthYear<(getdate()-30)和tSC.[服务能力]不为空
由tMY.MonthYear,tPL.[服务名称],tSC.[服务能力]--,tPL.[客户名称]分组
tMY.MonthYear Asc订购

代码运行,但我得到疯狂的入住率在300%或3%,所以数字一定是不正确的。我唯一确定的部分是在时间段内开始和结束时使用
[Placement\u Length\u in\u Days]
。这里的计算是错误的,我敢肯定。

为了让您快速了解,您可以尝试以下方法:

DECLARE @tbl_Placements TABLE
                        (
                            [Provider Name] VARCHAR(100), 
                            [Name of Client] VARCHAR(100), 
                            [Vacancy Filled Date] DATE, 
                            [Vacancy End Date] DATE
                        );

INSERT INTO @tbl_Placements 
VALUES ('Accommodation1', 'John Smith', '2018-08-04', '2018-08-12'),
       ('Accommodation1', 'Jane Smith ', '2019-01-28', '2019-04-09');

SELECT 
    p.[Provider Name], p.[Name of Client],
    DATEADD(DAY, A.Nmbr - 1, p.[Vacancy Filled Date]) AS OccupiedAt
FROM 
    @tbl_Placements p
CROSS APPLY
    (SELECT TOP (DATEDIFF(DAY, p.[Vacancy Filled Date], p.[Vacancy End Date]) + 1)
         ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
     FROM 
         master..spt_values) A(Nmbr);
简而言之:

  • 我们使用
    CROSS-APPLY
    为每行创建一个连接集
  • 我们使用computed
    TOP
    子句返回正确的行数
  • 我们只需查询任何具有足够行的表(这里我使用
    master..spt\u值
    ),就可以动态创建一个数字表。我们不需要实际表的内容,只需要从
    ROW\u NUMBER()
    获得一个计数器
  • 我们返回集合时,会附带一个运行日,从占用的第一天开始,到占用的最后一天结束
提示:如果您的数据库中有一个现有的物理数字/日期表,这就容易多了。您只需在
ON
-子句中使用
之间的
将该表内部联接即可。

您可以。

要快速拍摄,您可以尝试以下方法:

DECLARE @tbl_Placements TABLE
                        (
                            [Provider Name] VARCHAR(100), 
                            [Name of Client] VARCHAR(100), 
                            [Vacancy Filled Date] DATE, 
                            [Vacancy End Date] DATE
                        );

INSERT INTO @tbl_Placements 
VALUES ('Accommodation1', 'John Smith', '2018-08-04', '2018-08-12'),
       ('Accommodation1', 'Jane Smith ', '2019-01-28', '2019-04-09');

SELECT 
    p.[Provider Name], p.[Name of Client],
    DATEADD(DAY, A.Nmbr - 1, p.[Vacancy Filled Date]) AS OccupiedAt
FROM 
    @tbl_Placements p
CROSS APPLY
    (SELECT TOP (DATEDIFF(DAY, p.[Vacancy Filled Date], p.[Vacancy End Date]) + 1)
         ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
     FROM 
         master..spt_values) A(Nmbr);
简而言之:

  • 我们使用
    CROSS-APPLY
    为每行创建一个连接集
  • 我们使用computed
    TOP
    子句返回正确的行数
  • 我们只需查询任何具有足够行的表(这里我使用
    master..spt\u值
    ),就可以动态创建一个数字表。我们不需要实际表的内容,只需要从
    ROW\u NUMBER()
    获得一个计数器
  • 我们返回集合时,会附带一个运行日,从占用的第一天开始,到占用的最后一天结束
提示:如果您的数据库中有一个现有的物理数字/日期表,这就容易多了。您只需在
ON
-子句中使用
之间的
将该表内部联接即可。

你可以。

我从一个
m:n
天表和一个住宿表之间的关系开始,映射表显示每天一行,其中一个住宿被占用。你可以对更大的周期进行预计算,并对任何给定的周期进行缩小。请在示例数据中添加更多的行,以模拟一些边缘情况(重叠等)请提供DDL和insert语句。请提供预期的输出。嗨,Shnugo。谢谢你回到我这里。很抱歉,我对这个网站有点陌生,所以我不确定我应该提供什么。但我会得到这些东西并添加到这里。你的编辑没有太大帮助…你检查了我的建议吗?应该是enough t在给定的时间段内计算每个住宿的行数Hi Shnugo,我今天刚刚回到这里,请原谅,我将查看下面发布的答案,看看这是否可行,但我会这样做
DECLARE @tbl_Placements TABLE
                        (
                            [Provider Name] VARCHAR(100), 
                            [Name of Client] VARCHAR(100), 
                            [Vacancy Filled Date] DATE, 
                            [Vacancy End Date] DATE
                        );

INSERT INTO @tbl_Placements 
VALUES ('Accommodation1', 'John Smith', '2018-08-04', '2018-08-12'),
       ('Accommodation1', 'Jane Smith ', '2019-01-28', '2019-04-09');

SELECT 
    p.[Provider Name], p.[Name of Client],
    DATEADD(DAY, A.Nmbr - 1, p.[Vacancy Filled Date]) AS OccupiedAt
FROM 
    @tbl_Placements p
CROSS APPLY
    (SELECT TOP (DATEDIFF(DAY, p.[Vacancy Filled Date], p.[Vacancy End Date]) + 1)
         ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
     FROM 
         master..spt_values) A(Nmbr);