读书人

再开新贴,一个类似于行列转换的有关问

发布时间: 2012-02-16 21:30:36 作者: rapoo

再开新贴,一个类似于行列转换的问题,望大侠们解决一下,特此感谢,高分赠予!
例:有一个表,结构如下(同一类型的未终止的只有一个或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)

读书人网 >SQL Server

热点推荐