![](/img/trans.png)
[英]Iterate through rows and insert data in temp table - SQL Server 2008
[英]SQL Server - loop through temp table and calculate multiple values to insert rows into second table
我有一個臨時表#TEMP1,它可以拉回患者的下一個治療日期以及給定日期范圍內計划的治療總數。 臨時表中有一個值,該值為我提供了每次治療之間的最少天數。
我需要做的是獲取下一個治療日期,確定在下一個治療日期之后有多少計划的治療,並使用計划日期填充第二個臨時表#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
在#TEMP2中,PATIENT_2將具有9行,而PATIENT_3將僅具有1行。
在SQL Server 2008中可以這樣做嗎? 在使用行數之前,我已經完成了非常基本的循環,但是從技術上講,這並不是在一個表中循環,所以我不確定如何開始或什至有可能(我沒有很多編寫高級代碼的經驗。 SQL代碼)。
確保您閱讀了我發布的鏈接。 同時,這是一個使用您發布的信息的功能示例。 實際上,我在系統中將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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.