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

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



...全文
111 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老大马上就来,我顶一把好了.
1 安装方法: 此系统为测试版本,只是一个大体的框架,直接解压缩到c: ewsoft目录下即可,注意只能为此目录,且不能改变其目录结构,在正式版中将提供自动目录搜寻功能。 “newsoft”目录下为源文件。 “my”子目录中为系统的exe文件,双击即可运行。 “lib”子目录为系统存放类文件目录。 2 功能介绍: 对办公用品的购买,领取进行管理。 本系统可以设置用户权限,根据权限可以实现不同级别的操作; 系统初始密码为:超级用户:用户名、口令都为vip 一般用户:用户名、口令都为user 类别添加:添加所购物品分类,如钢笔、笔记本等; 部门添加:添加公司部门,还没有加上,有兴趣的朋友可以自己加上,方法与类别添加一样,表名为bm; 物品入库:采购来的物品应及时入库,若两次采购相同的物品,系统会自动计算其平均价格,并更新购买日期。注:此版本现只能计算平均成本和更新最后采购日期,但当有多个采购员是不能看出到底是谁进的货,有兴趣的朋友可以修改。 领用登记:领用办公用品后,应及时入库登记,系统会自动分摊费用,可以按月、季、年结帐分摊费用。注:设想改为到一定时期(如一个月),自动备份数据,打印报表,交财务分摊费用。 报表打印:可以按年、季、月或自定义一段时期打印报表。 更多功能正在完善中,可以来信与我交流。 3 系统说明 由于时间仓促,系统的详细说明教程还没有写,需要的朋友可以来信索取,等完成后我会发到您的信箱中。 4 意见反馈 由于近期要为公司开发一套办公管理软件(网络版),这是其中一个模块,希望您试用以后能给我一点意见。

34,871

社区成员

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

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