SQL 服务器 - 遍历临时 table 并计算多个值以将行插入第二个 table
SQL Server - loop through temp table and calculate multiple values to insert rows into second table
我有一个临时表 table,#TEMP1,它可以拉回患者的下一个治疗日期和给定日期范围内的计划治疗总数。在 temp table 中有一个值,它给出了每次治疗之间的最小天数。
我需要做的是获取下一个治疗日期,确定下一个治疗日期之后有多少计划治疗,并使用计划日期填充第二个温度 table,#TEMP2。
例如,在#TEMP1 中,包含以下数据:
patient next_tx_dt planned_tx_cnt min_days_bt start_range end_range
PATIENT_1 2/15/2015 4 28 2/1/2015 6/1/2015
PATIENT_2 2/05/2015 9 12 2/1/2015 6/1/2015
PATIENT_3 5/17/2015 1 112 2/1/2015 6/1/2015
我想遍历#TEMP1 并为每一行计算计划治疗的日期。因此,一行可以循环一次 (PATIENT_3) 或九次 (PATIENT_2),每次循环都会在#TEMP2 中产生一个新行。
PATIENT_1 在成功循环后将在 #TEMP2 中产生以下结果:
pat_id planned_tx_dt planned_tx_cnt
PATIENT_1 2/15/2015 1
PATIENT_1 3/15/2015 2
PATIENT_1 4/12/2015 3
PATIENT_1 5/10/2015 4
PATIENT_2 将有 9 行,而 PATIENT_3 在#TEMP2 中只有 1 行。
是否可以在 SQL Server 2008 中执行此操作?在使用行计数之前,我已经完成了非常基本的循环,但从技术上讲,这并不是通过 table 循环,所以我不确定如何开始,或者是否有可能(我没有很多编写高级 SQL 代码的经验)。
请务必阅读我发布的 link。同时,这是一个使用您发布的信息的功能示例。实际上,我将 cteTally 作为我系统中的一个视图,因此我不必重新创建它。您可以根据需要调整 cte 部分以确保您有足够的行数。
if OBJECT_ID('tempdb..#temp1') is not null
drop table #temp1
create table #temp1
(
patient varchar(50)
, next_tx_dt date
, planned_tx_cnt int
, min_days_bt int
, start_range date
, end_range date
)
insert #temp1
select 'PATIENT_1', '2/15/2015', '4', '28', '2/1/2015', '6/1/2015' union all
select 'PATIENT_2', '2/05/2015', '9', '12', '2/1/2015', '6/1/2015' union all
select 'PATIENT_3', '5/17/2015', '1', '112', '2/1/2015', '6/1/2015';
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select *, DATEADD(DAY, (N - 1) * min_days_bt, next_tx_dt)
from #temp1 t1
join cteTally t on t.N <= t1.planned_tx_cnt
--where t1.patient = 'PATIENT_1'
我有一个临时表 table,#TEMP1,它可以拉回患者的下一个治疗日期和给定日期范围内的计划治疗总数。在 temp table 中有一个值,它给出了每次治疗之间的最小天数。
我需要做的是获取下一个治疗日期,确定下一个治疗日期之后有多少计划治疗,并使用计划日期填充第二个温度 table,#TEMP2。
例如,在#TEMP1 中,包含以下数据:
patient next_tx_dt planned_tx_cnt min_days_bt start_range end_range
PATIENT_1 2/15/2015 4 28 2/1/2015 6/1/2015
PATIENT_2 2/05/2015 9 12 2/1/2015 6/1/2015
PATIENT_3 5/17/2015 1 112 2/1/2015 6/1/2015
我想遍历#TEMP1 并为每一行计算计划治疗的日期。因此,一行可以循环一次 (PATIENT_3) 或九次 (PATIENT_2),每次循环都会在#TEMP2 中产生一个新行。
PATIENT_1 在成功循环后将在 #TEMP2 中产生以下结果:
pat_id planned_tx_dt planned_tx_cnt
PATIENT_1 2/15/2015 1
PATIENT_1 3/15/2015 2
PATIENT_1 4/12/2015 3
PATIENT_1 5/10/2015 4
PATIENT_2 将有 9 行,而 PATIENT_3 在#TEMP2 中只有 1 行。
是否可以在 SQL Server 2008 中执行此操作?在使用行计数之前,我已经完成了非常基本的循环,但从技术上讲,这并不是通过 table 循环,所以我不确定如何开始,或者是否有可能(我没有很多编写高级 SQL 代码的经验)。
请务必阅读我发布的 link。同时,这是一个使用您发布的信息的功能示例。实际上,我将 cteTally 作为我系统中的一个视图,因此我不必重新创建它。您可以根据需要调整 cte 部分以确保您有足够的行数。
if OBJECT_ID('tempdb..#temp1') is not null
drop table #temp1
create table #temp1
(
patient varchar(50)
, next_tx_dt date
, planned_tx_cnt int
, min_days_bt int
, start_range date
, end_range date
)
insert #temp1
select 'PATIENT_1', '2/15/2015', '4', '28', '2/1/2015', '6/1/2015' union all
select 'PATIENT_2', '2/05/2015', '9', '12', '2/1/2015', '6/1/2015' union all
select 'PATIENT_3', '5/17/2015', '1', '112', '2/1/2015', '6/1/2015';
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select *, DATEADD(DAY, (N - 1) * min_days_bt, next_tx_dt)
from #temp1 t1
join cteTally t on t.N <= t1.planned_tx_cnt
--where t1.patient = 'PATIENT_1'