日期:2014-05-20  浏览次数:20904 次

《SQL交叉表的具体语法》
[人员信息表]
人员Id 姓名 岗位 性别 部门 年龄 管理级别 学历 政治面貌 出生日期 籍贯 民族 ...
001 张三 经理 男 A 40 干部 本科 党员 1970 天津 苗族
002 李四 客服 女 B 23 员工 硕士 预备党员 1989 上海 汉族
003 王五 店长 男 C 27 干部 大专 共青团员 1983 重庆 藏族
004 王一 保安 女 E 32 工人 中专 群众 1981 山西 傣族
004 小李 司机 男 F 25 工人 高中 团员 1987 北京 汉族
005 小张 司机 男 F 38 工人 初中 群众 1975 山东 汉族
... ... ... ... ... ... ... ... ... ... ... ...

假定以上数据为一张SQL2000的 '人员信息表'的部分字段,现在我想要用sql的查询语言来实现交叉表表的汇总信息,让它显示为下面格式的一

张汇总交叉报表:请问这个SQL的具体查询语言该怎样来写才能实现呢?如那位高手/大侠能帮小弟做出来,定当感激不尽啊!!!
哦:如能做出的话,我的QQ:912478949 QQ邮箱为:912478949qq.com! 邮箱为:zhangfs@jklb.com 小弟再次谢过!!!!!!!!
 

工种/岗位 小学 初中 高中 大专 本科 硕士 党员 预备党员 共青团员 团员 群众
 经理 ... ... ... ... ... ... ... ... ... ... ...
 客服 ... ... ... ... ... ... ... ... ... ... ...
 店长 ... ... ... ... ... ... ... ... ... ... ...
 保安 ... ... ... ... ... ... ... ... ... ... ...
 司机 ... ... ... ... ... ... ... ... ... ... ...
 
说明:这就是根据以上的[人员信息表]的,用SQL查询出来的结果汇总表,其中“...”表示具体查询出来的汇总数据。
比如:司机这个岗位查询出来的有多少个司机是小学学历,有多少个司机是初中学历、有多少个司机是高中学历、有多少个司机是大专学历、

、、、、有多少个司机的政治面貌为党员、、、有多少个司机的政治面貌为群众、、、、、、、、!

------解决方案--------------------
1、先去SQL板块看看相关行转列的话题
2、实在不行,去SQL板块问问
------解决方案--------------------
1先建立一个临时表
2用游标遍历人员信息表,例如:有几个经理,对应的字段就累加几
3select 临时表
------解决方案--------------------
SQL code


--> 测试数据: #t
if object_id('tempdb.dbo.#t') is not null drop table #t
create table #t (人员Id varchar(3),姓名 varchar(4),岗位 varchar(4),性别 varchar(2),部门 varchar(1),年龄 int,管理级别 varchar(4),学历 varchar(4),政治面貌 varchar(8),出生日期 int,籍贯 varchar(4),民族 varchar(4))
insert into #t
select '001','张三','经理','男','A',40,'干部','本科','党员',1970,'天津','苗族' union all
select '002','李四','客服','女','B',23,'员工','硕士','预备党员',1989,'上海','汉族' union all
select '003','王五','店长','男','C',27,'干部','大专','共青团员',1983,'重庆','藏族' union all
select '004','王一','保安','女','E',32,'工人','中专','群众',1981,'山西','傣族' union all
select '004','小李','司机','男','F',25,'工人','高中','团员',1987,'北京','汉族' union all
select '005','小张','司机','男','F',38,'工人','初中','群众',1975,'山东','汉族'

select * from #t

declare @sql varchar(8000)
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
declare @sql3 varchar(8000)
    select @sql = isnull(@sql + ',' , '') + '['+政治面貌+']' from #T group by 政治面貌     
    select @sql1 =isnull(@sql1 + ',' , '')+'sum(['+政治面貌+']) ['+政治面貌+']' from #t group by 政治面貌    
    
    select @sql2 = isnull(@sql2 + ',' , '') + '['+学历+']' from #T group by 学历     
    select @sql3 =isnull(@sql3 + ',' , '')+'sum(['+学历+']) ['+学历+']' from #t group by 学历    
    
    
    
exec('select k.*,'+@sql2+' from ( select 岗位, '+@sql1 +
' from ( select * from (select 岗位,人员Id,政治面貌 from #T) a pivot ( count(人员Id) for 政治面貌  in ('
 + @sql + ')) b)c group by 岗位)k join
 (select 岗位, '+@sql3 +
' from ( select * from (select 岗位,人员Id,学历 from #T) a pivot ( count(人员Id) for 学历  in ('
 + @sql2 + ')) b)c group by 岗位)j on k.岗位=j.岗位 ')
 
岗位    党员    共青团员    群众    团员    预备党员    本科    初中    大专    高中    硕士    中专
保安    0    0    1    0    0    0    0    0    0    0    1
店长    0    1    0    0    0    0    0    1    0    0    0
经理    1    0    0    0    0    1    0    0    0    0    0
客服    0    0    0    0    1    0    0    0    0    1    0
司机    0    0    1    1    0    0    1    0    1    0    0

------解决方案--------------------