请问这样一个报表如何实现

ppxstar 2009-03-06 03:42:48
主表

姓名 部门 学历 职称
张三 部门3 大专 中级
李四 部门1 大专 初级
王五 部门2 大专 初级
马六 部门9 大专 高级
赵七 部门2 大专 中级
周八 部门2 大专 中级
.........
.........

部门表
部门1
部门2
....
部门n

职称表
初级
中级
高级
超级
....
超超超超高级


最后我想得到下表

部门 合计 初级 中级 .... 超超超超高级
部门1 100 30 13 .... 2
.....
部门n 50 20 5 .... 0


上表中
列的字段名称是从部门表得到的
行的字段名称,除 部门和合计外,都是从职称表里得到

请问如何实现,最好直接在sql里实现,视图,存储都可以,我用的mssql2005



...全文
105 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
辉一哥 2009-03-06
  • 打赏
  • 举报
回复
存储过程
sdhdy 2009-03-06
  • 打赏
  • 举报
回复
存储过程,视图不可以。
dawugui 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ppxstar 的回复:]
可是上面语句在mssql里要存成什么形式才能在程序里调用。
好像用存储过程吧,视图可以吗?
[/Quote]
做成存储过程,去调用.

或者你print(@Sql)把语句生成出来.

然后在程序用循环生成这个语句,动态执行.
ppxstar 2009-03-06
  • 打赏
  • 举报
回复
可是上面语句在mssql里要存成什么形式才能在程序里调用。
好像用存储过程吧,视图可以吗?
ppxstar 2009-03-06
  • 打赏
  • 举报
回复
可以了,是我实际表里字段名称不一样的原因
ppxstar 2009-03-06
  • 打赏
  • 举报
回复
怎么提示我

消息 208,级别 16,状态 1,第 3 行
对象名 '职称' 无效。
dawugui 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ppxstar 的回复:]
试验好像不是对吧
t1里面只有部门,哪有职称呀

还有你这t1,应当是放在
set @sql = @sql + ' , count(*) 合计 from 部门表 t1 这里一个吧[/Quote]
3楼写错了,6楼改过来了,不好意思.
sdhdy 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ppxstar 的回复:]
引用 3 楼 dawugui 的回复:
SQL code--sql 2000的动态SQL.

declare @sql varchar(8000)
set @sql = 'select t1.部门 '
select @sql = @sql + ' , sum(case t1.职称 when ''' + 职称 + ''' then 1 else 0 end) [' + 职称 + ']'
from (select distinct 职称 from 职称表) as a
set @sql = @sql + ' , count(*) 合计 from 部门表 left join 主表 t2 on t1.部门 = t2.部门 group by t1.部门'
exec(@sql)


试验好…
[/Quote]
看看我的。
ppxstar 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
SQL code--sql 2000的动态SQL.

declare @sql varchar(8000)
set @sql = 'select t1.部门 '
select @sql = @sql + ' , sum(case t1.职称 when ''' + 职称 + ''' then 1 else 0 end) [' + 职称 + ']'
from (select distinct 职称 from 职称表) as a
set @sql = @sql + ' , count(*) 合计 from 部门表 left join 主表 t2 on t1.部门 = t2.部门 group by t1.部门'
exec(@sql)
[/Quote]

试验好像不是对吧
t1里面只有部门,哪有职称呀

还有你这t1,应当是放在
set @sql = @sql + ' , count(*) 合计 from 部门表 t1 这里一个吧
ks_reny 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dawugui 的回复:]
SQL codecreate table 主表 (姓名 varchar(10), 部门 varchar(10), 学历 varchar(10), 职称 varchar(10))
insert into 主表 values('张三' , '部门3' , '大专' , '中级')
insert into 主表 values('李四' , '部门1' , '大专' , '初级')
insert into 主表 values('王五' , '部门2' , '大专' , '初级')
insert into 主表 values('马六' , '部门9' , '大专' , '高级')
insert into 主表 values('赵七' , '部门2' , '大专' …
[/Quote]
真崇拜大烏龜呀.
anwsp 2009-03-06
  • 打赏
  • 举报
回复
mark
sdhdy 2009-03-06
  • 打赏
  • 举报
回复

看错了,modify。
declare @sql varchar(8000)
set @sql = 'select c.部门名称 部门,count(*) 合计 '
select @sql = @sql + ' , sum(case 职称 when ''' + 职称 + ''' then 1 else 0 end) [' + 职称 + ']'
from (select distinct 职称 from 职称表 ) as a
set @sql = @sql + ' from 主表 b left join 部门表 c on c.部门=b.部门 group by b.部门 order by b.部门'
exec(@sql)
sdhdy 2009-03-06
  • 打赏
  • 举报
回复

--加上部门名称
declare @sql varchar(8000)
set @sql = 'select c.部门名称 部门,(select count(1) from 主表 where 部门=b.部门) 合计 '
select @sql = @sql + ' , max(case 职称 when ''' + 职称 + ''' then 职称 else '''' end) [' + 职称 + ']'
from (select distinct 职称 from 职称表 ) as a
set @sql = @sql + ' from 主表 b left join 部门表 c on c.部门=b.部门 group by b.部门 order by b.部门'
exec(@sql)
dawugui 2009-03-06
  • 打赏
  • 举报
回复
create table 主表 (姓名 varchar(10), 部门 varchar(10), 学历 varchar(10), 职称 varchar(10))
insert into 主表 values('张三' , '部门3' , '大专' , '中级')
insert into 主表 values('李四' , '部门1' , '大专' , '初级')
insert into 主表 values('王五' , '部门2' , '大专' , '初级')
insert into 主表 values('马六' , '部门9' , '大专' , '高级')
insert into 主表 values('赵七' , '部门2' , '大专' , '中级')
insert into 主表 values('周八' , '部门2' , '大专' , '中级')
create table 部门表 (部门 varchar(10))
insert into 部门表 values('部门1')
insert into 部门表 values('部门2')
insert into 部门表 values('部门3')
insert into 部门表 values('部门9')
create table 职称表 (职称 varchar(20))
insert into 职称表 values('初级')
insert into 职称表 values('中级')
insert into 职称表 values('高级')
insert into 职称表 values('超级')
insert into 职称表 values('超超超超高级')
go

--sql 2000的动态SQL.

declare @sql varchar(8000)
set @sql = 'select t1.部门 , count(*) 合计 '
select @sql = @sql + ' , sum(case t2.职称 when ''' + 职称 + ''' then 1 else 0 end) [' + 职称 + ']'
from (select distinct 职称 from 职称表) as a
set @sql = @sql + ' from 部门表 t1 left join 主表 t2 on t1.部门 = t2.部门 group by t1.部门'
exec(@sql)

drop table 主表,部门表,职称表

/*
部门 合计 超超超超高级 超级 初级 高级 中级
---------- ----------- ----------- ----------- ----------- ----------- -----------
部门1 1 0 0 1 0 0
部门2 3 0 0 1 0 2
部门3 1 0 0 0 0 1
部门9 1 0 0 0 1 0
*/
sdhdy 2009-03-06
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select 部门,(select count(1) from 主表 where 部门=b.部门) 合计 '
select @sql = @sql + ' , max(case 职称 when ''' + 职称 + ''' then 职称 else '''' end) [' + 职称 + ']'
from (select distinct 职称 from 职称表 ) as a
set @sql = @sql + ' from 主表 b group by 部门 order by 部门'
exec(@sql)
dawugui 2009-03-06
  • 打赏
  • 举报
回复
--sql 2000的动态SQL.

declare @sql varchar(8000)
set @sql = 'select t1.部门 '
select @sql = @sql + ' , sum(case t1.职称 when ''' + 职称 + ''' then 1 else 0 end) [' + 职称 + ']'
from (select distinct 职称 from 职称表) as a
set @sql = @sql + ' , count(*) 合计 from 部门表 left join 主表 t2 on t1.部门 = t2.部门 group by t1.部门'
exec(@sql)
htl258_Tony 2009-03-06
  • 打赏
  • 举报
回复
帮顶好了
htl258_Tony 2009-03-06
  • 打赏
  • 举报
回复
动态行列转换,wugui老大马上就来,我顶一把好了.

34,837

社区成员

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

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