根据" FromRange"生成行范围" ToRange"每一行的字段

时间:2016-04-16 11:37:37

标签: sql-server tsql

我有一个包含以下字段的表格:
DailyWork(ID, WorkerID, FromHour, ToHour)假设所有字段都是INT类型 此表格需要在T_SQL语句中进行扩展,才能成为JOIN的一部分 通过展开一行,我的意思是,为FromHourToHour范围内的每个数字生成一小时。然后将其与声明的其余部分一起加入。

示例:
假设,我有另一个这样的表:Worker(ID, Name)。一个简单的SELECT语句就像这样:

SELECT * FROM
Worker JOIN DailyWork ON Worker.ID = DailyWork.WorkerID

结果的列类似于:WorkerID, Name, DailyWorkID, WorkerID, FromHour, ToHour
但是,我需要的是这样的列:WorkerID, Name, Hour 事实上,FromHourToHour的范围已扩大。并且每个单独的小时放在Hour列中的单独行中 虽然我读了类似的问题to generate a range of number,但它并没有真正帮助。

2 个答案:

答案 0 :(得分:1)

我从一个数字列表开始,然后这很容易。通常,表master.spt_values用于此目的:

with nums as (
      select row_number() over (order by (select null)) - 1 as n
      from master.spt_values
     )
select dw.*, (dw.fromhour + nums.n) as specifichour
from dailywork dw join
     nums
     on dw.tohour >= dw.fromhour + nums.n;

master.spt_values通常至少有几千行。

答案 1 :(得分:0)

另一个解决方案是......

WITH [DayHours] AS (
    SELECT 1 AS [DayHour]
    UNION ALL
    SELECT [DayHour] + 1 FROM [DayHours] WHERE [DayHour] + 1 <= 24
)
SELECT [Worker] 
JOIN [DayHours] ON [Worker].[FromHour] <= [DayHours].[DayHour]
            AND [Worker].[ToHour] >= [DayHours].[DayHour]