当前位置: 代码迷 >> Sql Server >> 怎么将连续住院记录汇总为一条记录,如示例
  详细解决方案

怎么将连续住院记录汇总为一条记录,如示例

热度:85   发布时间:2016-04-24 09:36:10.0
如何将连续住院记录汇总为一条记录,如示例
示例表
姓名                       入院日期                          出院日期
aaaaa                   20140101                        20140115
aaaaa                   20140201                        20140220
bbbbb                   20140101                        20140115
bbbbb                   20140115                        20140205
bbbbb                   20140301                        20140320
cccccc                   20140101                        20140115
cccccc                  20140115                          20140201
cccccc                  20140201                          20140220
cccccc                  20140220                          20140305
希望得到
姓名                       入院日期                          出院日期
aaaaa                   20140101                        20140115
aaaaa                   20140201                        20140220
bbbbb                   20140101                        20140205
bbbbb                   20140301                        20140320
cccccc                  20140101                        20140305
------解决思路----------------------
SELECT 姓名,MIN(入院日期)[入院日期],MAX(出院日期)[出院日期]FROM(
SELECT
T1.姓名
,T1.入院日期
,T1.出院日期
,DATEDIFF(DAY,'19000101',T1.出院日期)
-SUM(DATEDIFF(DAY,T2.入院日期,T2.出院日期))GR
FROM TB T1
JOIN TB T2 ON T1.入院日期>=T2.入院日期
GROUP BY
T1.姓名
,T1.入院日期
,T1.出院日期
)T
GROUP BY 姓名,GR

------解决思路----------------------

with a1 (姓名,入院日期,出院日期) as
(
select 'aaaaa','20140101','20140115' union all
select 'aaaaa','20140201','20140220' union all
select 'bbbbb','20140101','20140115' union all
select 'bbbbb','20140115','20140205' union all
select 'bbbbb','20140301','20140320' union all
select 'cccccc','20140101','20140115' union all
select 'cccccc','20140115','20140201' union all
select 'cccccc','20140201','20140220' union all
select 'cccccc','20140220','20140305'
)
SELECT x.姓名,x.入院日期,MIN(y.出院日期) 出院日期  
FROM   
(
SELECT  a.姓名,a.入院日期   
FROM a1 a LEFT OUTER JOIN a1 b   
ON a.姓名=b.姓名 and a.入院日期>b.入院日期 AND a.入院日期<=b.出院日期 
GROUP BY a.姓名,a.入院日期 
HAVING COUNT(b.入院日期)=0
) x   
INNER JOIN   
(
SELECT a.姓名,a.出院日期   
FROM a1 a LEFT OUTER JOIN a1 b   
ON a.姓名=b.姓名 and a.出院日期>=b.入院日期 AND a.出院日期<b.出院日期 
GROUP BY a.姓名,a.出院日期 
HAVING COUNT(b.入院日期)=0
) y   
ON x.姓名=y.姓名 and x.入院日期<=y.出院日期 
GROUP BY x.姓名,x.入院日期
  相关解决方案