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

涛声宜旧 2007-01-29 02:23:35
例:有一个表,结构如下(同一类型的未终止的只有一个或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)
...全文
284 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
marco08 2007-01-29
  • 打赏
  • 举报
回复
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)

34,571

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧