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