-1

我在Microsoft SQL Server 2016中有一个棘手的情况,其中我需要获取员工在 PayPeriod 中休假 (LOA) 的日期列表,其中包含固定的 PeriodStart 和固定的 PeriodEnd 列。

见下图(源数据集):

在此处输入图像描述

我在 5 行数据集中有 4 名员工。

PeriodStart 和 PeriodEnd 始终是固定的,其值分别为 12 月 15 日和 12 月 22 日(对于 2020 年)。我将每个员工的 LOA 开始日期和 LOA 结束日期放在不同的列中。源数据集在任何给定时间都只有一组 PeriodStart 和 PeriodEnd 日期。假设在上述情况下,始终是 12 月 15 日和 12 月 22 日。在其他情况下,将是 12 月 22 日和 12 月 29 日。但在给定时间只有一个范围。源数据集不能包含员工 X 的 12 月 15 日 - 12 月 22 日和员工 Y 的 12 月 22 日 - 12 月 29 日。

所需的输出如下:

在此处输入图像描述

这里的挑战是,我正在使用我们客户的查询生成器,它不能使用T-SQL对象,例如临时表 (#)、表变量 (@)、公用表表达式 (CTE)、用户定义函数甚至视图。

纯粹是临时报告,您只能在其中创建派生表(或子查询)并拥有别名并将其用作数据集。这样的数据集可用于 JOIN 和其他常规内容。

例如:

SELECT a, b

FROM

(SELECT t1.a, t2.b
FROM table1 t1
INNER JOIN table2 t2
ON t1.ID = t2.ID) XYZ

派生表(或子查询) XYZ 是我的主要数据集。

我需要我想要的输出别名为 XYZ。

谁能帮我实现这一目标?

4

1 回答 1

0
SELECT
  yourTable.EmployeeID,
  DATEADD(DAY, calendar.date_id, yourTable.PeriodStart)
FROM
(
  SELECT
    ROW_NUMBER() OVER (ORDER BY the_primary_key) - 1 AS date_id    
  FROM
    any_big_enough_table
)
  AS calendar
INNER JOIN
  yourTable
    ON  calendar.date_id <= DATEDIFF(DAY, yourTable.PeriodStart, yourTable.PeriodEnd)
    AND calendar.date_id >= DATEDIFF(DAY, yourTable.PeriodStart, yourTable.LOAStartDate)
    AND calendar.date_id <= DATEDIFF(DAY, yourTable.PeriodStart, yourTable.LOAEndDate)

错别字还请见谅,我在打电话。

于 2021-04-15T23:22:54.920 回答