首页 新闻 搜索 专区 学院

SqlServer 列转行

0
悬赏园豆:10 [已解决问题] 解决于 2019-09-11 15:10

现在有这样一张表,如下:

CREATE TABLE tbl_列转行测试(
[UserID] [int] NULL,
[UserNo] [int] NULL,
企业养老 int,
企业医疗 int,
企业工伤 int,
企业养老补缴 int,
企业养老补缴月 int,
企业医疗补缴 int,
企业医疗补缴月 int,
企业工伤补缴 int,
企业工伤补缴月 int,
个人养老 int,
个人医疗 int,
个人养老补缴 int,
个人养老补缴月 int,
个人医疗补缴 int,
个人医疗补缴月 int,
Num int
) ON [PRIMARY]

insert into tbl_列转行测试 values(1,1,11,22,33,55,2,32,3,54,5,56,67,10,3,12,6,12345567)

原表运行结果如下:

现在需要把这一行数据,转化为如下的结果:

该如何实现呢???

Sql
gyangjing的主页 gyangjing | 初学一级 | 园豆:11
提问于:2018-04-13 17:44
< >
分享
最佳答案
0
收获园豆:10
大志若愚 | 小虾三级 |园豆:1212 | 2018-04-13 17:59

 此方法,貌似不能满足我的这个需求

gyangjing | 园豆:11 (初学一级) | 2018-04-13 18:09
其他回答(2)
0

尝试用case when than

澜月 | 园豆:202 (菜鸟二级) | 2018-04-13 18:20

能否给个例子呢

支持(0) 反对(0) gyangjing | 园豆:11 (初学一级) | 2018-04-13 21:38
0

这个问题现在有了这样的解决方法了,第一部,先把企业部分的列转行,代码和效果如下:

select * into #tempAA from (
SELECT USERID,USERNO,险种类型=attribute,value as 企业金额,
CASE attribute
when '企业养老' then (select 企业养老补缴 from tbl_列转行测试 b where UserID=UPV.Userid)
when '企业医疗' then (select 企业医疗补缴 from tbl_列转行测试 b where UserID=UPV.Userid)
when '企业工伤' then (select 企业工伤补缴 from tbl_列转行测试 b where UserID=UPV.Userid)
else 0 end as 企业补缴金额,
CASE attribute
when '企业养老' then (select 企业养老补缴月 from tbl_列转行测试 b where UserID=UPV.Userid)
when '企业医疗' then (select 企业医疗补缴月 from tbl_列转行测试 b where UserID=UPV.Userid)
when '企业工伤' then (select 企业工伤补缴月 from tbl_列转行测试 b where UserID=UPV.Userid)
else 0 end as 企业补缴月份,
Num
FROM (select * from tbl_列转行测试)a
UNPIVOT
(
value FOR attribute IN(企业养老,企业医疗,企业工伤)
) AS UPV
) AA

再把个人部分的列转行,代码和效果如下:

select * into #tempBB from (
SELECT USERID,USERNO,险种类型=attribute,value as 个人金额,
CASE attribute
when '个人养老' then (select 个人养老补缴 from tbl_列转行测试 b where UserID=UPV.Userid)
when '个人医疗' then (select 个人医疗补缴 from tbl_列转行测试 b where UserID=UPV.Userid)
else 0 end as 个人补缴金额,
CASE attribute
when '个人养老' then (select 个人养老补缴月 from tbl_列转行测试 b where UserID=UPV.Userid)
when '个人医疗' then (select 个人医疗补缴月 from tbl_列转行测试 b where UserID=UPV.Userid)
else 0 end as 个人补缴月份,
Num
FROM (select * from tbl_列转行测试)a
UNPIVOT
(
value FOR attribute IN(个人养老,个人医疗)
) AS UPV
) BB

然后再把这两个临时表合并,代码和效果如下:

select a.userid,a.userno,right(a.险种类型,2) as 险种类型,a.企业金额,b.个人金额,a.企业补缴金额 as 企业补缴,b.个人补缴金额 as 个人补缴,a.企业补缴月份,b.个人补缴月份,a.num
from #tempAA a
left join #tempBB b on a.userid=b.userid and right(a.险种类型,2)=right(b.险种类型,2)
where a.UserID=1

至此,本问题完美解决!!

gyangjing | 园豆:11 (初学一级) | 2018-04-14 14:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册