首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

再开新贴,一个类似于行列转换的有关问题,望大侠们解决一下,特此感谢,高分赠予

2012-02-16 
再开新贴,一个类似于行列转换的问题,望大侠们解决一下,特此感谢,高分赠予!例:有一个表,结构如下(同一类型

再开新贴,一个类似于行列转换的问题,望大侠们解决一下,特此感谢,高分赠予!
例:有一个表,结构如下(同一类型的未终止的只有一个或0个,共6种类型,分别用0,1,2,3,4,5代替)    
开始日期     结束日期   个人基数     单位基数     类型       是否终止
2005-5-5     2006-1-2       100               200             0                 1    
2005-6-5                           500               600             0                 0    
2005-3-6                           400               300             1                 0    
2005-8-9     2007-1-1       10                 20               2                 1    
2007-1-4                           30                 40               2                 0    
2003-3-3                           60                 70               4                 0    
 
需得到发下结构的表(所有未终止的或没有的类型)    
类型                 结果    
  0                         500           说明:(个人基数)    
  0                         600           说明:(单位基数)    
  1                         400           说明:(个人基数)    
  1                         300           说明:(单位基数)    
  2                         30             说明:(个人基数)    
  2                         40             说明:(单位基数)    
  3                         0               说明:(个人基数,因此类型的数据不存在,则基数为0)    
  3                         0               说明:(单位基数,因此类型的数据不存在,则基数为0)    
  4                         60             说明:(个人基数)    
  4                         70             说明:(单位基数)    
  5                         0               说明:(个人基数,因此类型数据不存在,则基数为0)    


  5                         0               说明:(单位基数,因此类型数据不存在,则基数为0)


[解决办法]
create table T(开始日期 datetime, 结束日期 datetime, 个人基数 int, 单位基数 int, 类型 int, 是否终止 bit)
insert T select '2005-5-5 ', '2006-1-2 ', 100, 200, 0, 1
union all select '2005-6-5 ', null, 500, 600, 0, 0
union all select '2005-3-6 ', null, 400, 300, 1, 0
union all select '2005-8-9 ', '2007-1-1 ', 10, 20, 2, 1
union all select '2007-1-4 ', null, 30, 40, 2, 0
union all select '2003-3-3 ', null, 60, 70, 4, 0

select tmpA.类型, 结果=isnull(tmpB.结果, 0), tmpA.说明
from
(
select 类型=0, 说明= '个人基数 '
union all
select 类型=0, 说明= '单位基数 '

union all
select 类型=1, 说明= '个人基数 '
union all
select 类型=1, 说明= '单位基数 '

union all
select 类型=2, 说明= '个人基数 '
union all
select 类型=2, 说明= '单位基数 '

union all
select 类型=3, 说明= '个人基数 '
union all
select 类型=3, 说明= '单位基数 '

union all
select 类型=4, 说明= '个人基数 '
union all
select 类型=4, 说明= '单位基数 '

union all
select 类型=5, 说明= '个人基数 '
union all
select 类型=5, 说明= '单位基数 '
)tmpA left join
(
select 类型, 结果=个人基数, 说明= '个人基数 ' from T where 是否终止=0
union all
select 类型, 结果=单位基数, 说明= '单位基数 ' from T where 是否终止=0
)tmpB on tmpA.类型=tmpB.类型 and tmpA.说明=tmpB.说明

--result
类型 结果 说明
----------- ----------- --------
0 500 个人基数
0 600 单位基数
1 400 个人基数
1 300 单位基数
2 30 个人基数
2 40 单位基数
3 0 个人基数
3 0 单位基数
4 60 个人基数
4 70 单位基数
5 0 个人基数
5 0 单位基数

(12 row(s) affected)

热点排行