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

一个涉及SQL转置查询的有关问题,有点难

2013-09-29 
一个涉及SQL转置查询的问题,有点难?有三个表:1、员工基本资料表2、员工保险资料表3、保险基本资料表想得到如

一个涉及SQL转置查询的问题,有点难?
有三个表:
1、员工基本资料表
一个涉及SQL转置查询的有关问题,有点难
2、员工保险资料表
一个涉及SQL转置查询的有关问题,有点难
3、保险基本资料表
一个涉及SQL转置查询的有关问题,有点难
想得到如下结果:
一个涉及SQL转置查询的有关问题,有点难

能否用一个语句或用view来实现,请高手不吝赐教,谢谢!




[解决办法]

select
   a.工号,a.姓名,
   max(case when c.保险内码=1 then b.个人负担比率 else '' end) as 养老保险个人负担比率,
   max(case when c.保险内码=1 then b.个人负担金额 else '' end) as 养老保险个人负担金额,
   max(case when c.保险内码=2 then b.个人负担比率 else '' end) as 医疗保险个人负担比率,
   max(case when c.保险内码=2 then b.个人负担金额 else '' end) as 医疗保险个人负担金额,
   max(case when c.保险内码=3 then b.个人负担比率 else '' end) as 失业保险个人负担比率,
   max(case when c.保险内码=3 then b.个人负担金额 else '' end) as 失业保险个人负担金额
from
   员工基本资料表 a,
   员工保险资料表 b,
   保险基本资料表 c
where
   a.员工内码=b.员工内码
and
   b.保险内码=c.保险内码

[解决办法]

create table 员工基本资料表
(员工内码 int,工号 varchar(10),姓名 varchar(10))

create table 员工保险资料表
(内码 int,员工内码 int,保险内码 int,个人负担比率 varchar(5),个人负担金额 varchar(5))

create table 保险基本资料表
(保险内码 int,代号 varchar(10),名称 varchar(10))

insert into 员工基本资料表
 select 1,'130001','张三' union all
 select 1,'130002','李四' union all
 select 1,'130003','王五' union all
 select 1,'130004','赵六'

insert into 员工保险资料表
 select 1,1,1,'2%','20' union all
 select 2,1,2,'3%','30' union all
 select 3,1,3,'5%','50' union all
 select 4,2,1,'2%','20' union all
 select 5,2,2,'3%','30' union all
 select 6,3,1,'2%','20' union all
 select 7,4,1,'2%','20' union all
 select 8,4,2,'3%','30' union all
 select 9,4,3,'5%','50'

insert into 保险基本资料表
 select 1,'001','养老保险' union all
 select 2,'002','医疗保险' union all
 select 3,'003','失业保险'
 

declare @tsql varchar(6000)

select @tsql=isnull(@tsql+',','')
            +'max(case when c.名称='''+名称+''' then a.个人负担比率 else '''' end) '''+名称+'个人负担比率'', '
            +'max(case when c.名称='''+名称+''' then a.个人负担金额 else '''' end) '''+名称+'个人负担金额'' '
  from 保险基本资料表

select @tsql='select b.工号,b.姓名,'+@tsql
            +' from 员工保险资料表 a '
            +' inner join 员工基本资料表 b on a.员工内码=b.员工内码 '
            +' inner join 保险基本资料表 c on a.保险内码=c.保险内码 '
            +' group by b.员工内码,b.工号,b.姓名 '
            +' order by b.员工内码 '

exec(@tsql)
 
/*
工号         姓名        养老保险个人负担比率 养老保险个人负担金额 医疗保险个人负担比率 医疗保险个人负担金额 失业保险个人负担比率 失业保险个人负担金额
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
130001     张三         2%         20         3%         30         5%         50
130002     李四         2%         20         3%         30         5%         50
130003     王五         2%         20         3%         30         5%         50


130004     赵六         2%         20         3%         30         5%         50

(4 row(s) affected)
*/

热点排行