首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server -遍历临时表并计算多个值将行插入到第二个表中

SQL Server -遍历临时表并计算多个值将行插入到第二个表中
EN

Stack Overflow用户
提问于 2015-02-03 19:32:55
回答 1查看 1.4K关注 0票数 1

我有一个临时表# temp 1,它把病人的下一个治疗日期和在给定日期范围内计划的治疗总数拉回来。在temp表中有一个值,它给出了每次治疗之间的最小天数。

我需要做的是取下一个治疗日期,确定在下一个治疗日期之后有多少计划的治疗,然后用计划的日期填充第二个临时表# temp 2。

例如,在#TEMP1 1中,包含以下数据:

代码语言:javascript
运行
复制
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 1,并为每一行计算计划治疗的日期。因此,一行可以循环一次(PATIENT_3)或九次(PATIENT_2),每个循环在#TEMP2 2中生成一个新行。

在一个成功的循环之后,PATIENT_1将在#TEMP2 2中获得以下结果:

代码语言:javascript
运行
复制
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 2中只有1行。

在Server 2008中可以这样做吗?在使用行计数之前,我已经完成了非常基本的循环,但从技术上讲,这并不是循环遍历表,所以我不知道如何开始,甚至可能(我没有编写高级SQL代码的大量经验)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-03 19:56:38

确保你读了我发布的链接。同时,这里有一个使用您发布的信息的功能示例。实际上,我在我的系统中把那个cteTally作为视图,所以我不需要重新创建它。您可以根据需要调整cte部分,以确保您有足够的行。

代码语言:javascript
运行
复制
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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28307223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档