部门年龄段学历人数统计

tianxiawusuan 2010-02-03 02:20:49
最近写了一个人数统计的系统,要求是列及行都是动态生成的
比如:
数据库里面已经建好一个基础表A:

表A 姓名 部门 学历 出生年月
A 后勤 高中 1986-1-1
B 后勤 初中 1984-3-7
C 管理 本科 1987-2-1
D 操作 专科 1976-2-1
. . . .
. . . .
要求从表A中查询部门,学历,年龄段(部门,学历都不是固定死的,要从数据库里面查询出来)动态的生成一下效果的表:
部门 年龄段 高中 初中 本科.......
后勤 20-30 3 4 3 .......
30-40 3 9 0 .......
40-50 0 30 3 .......
管理 20-30 9 2 2 .......

请问怎么实现啊???
...全文
293 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxiawusuan 2010-02-03
  • 打赏
  • 举报
回复 1
我按zengzhan的方法写了一个存储过程,显示成功 。我在新建查询的地方执行这个存储过程的时候,没有出现表格,只显示执行成功,这是什么原因啊
sdnjiejie65 2010-02-03
  • 打赏
  • 举报
回复
--表A 姓名 部门 学历 出生年月
--A 后勤 高中 1986-1-1
--B 后勤 初中 1984-3-7
--C 管理 本科 1987-2-1
--D 操作 专科 1976-2-1
drop function ageTime
go
--获取年龄段
create function ageTime(@date varchar(10))
returns varchar(10)
as
begin
--所除的整数
declare @i_year int,@result int
select @i_year=datediff(year,@date,getdate())
select @result=@i_year/10
if(@i_year%10>0)
begin
select @date=Convert(varchar(3),@result*10)+'-'+Convert(varchar(3),(@result+1)*10)
end
else
begin
select @date=Convert(varchar(3),(@result-1)*10)+'-'+Convert(varchar(3),@result*10)
end
return @date
end
go

if object_id('tempdb.dbo.#tb') is not null drop table tempdb.#tb
go
create table #tb(姓名 varchar(20),部门 varchar(20),学历 varchar(20),出生年月 varchar(10),年龄段 varchar(10))
insert into #tb
select 'A','后勤','高中','1986-1-1',dbo.ageTime('1986-1-1') union all
select 'B','后勤','初中','1984-3-7',dbo.ageTime('1984-3-7') union all
select 'C','管理','专科','1987-2-1',dbo.ageTime('1987-2-1') union all
select 'D','操作','专科','1976-2-1',dbo.ageTime('1976-2-1') union all
select 'E','后勤','高中','1986-1-1',dbo.ageTime('1986-1-1') union all
select 'F','后勤','初中','1984-3-7',dbo.ageTime('1984-3-7') union all
select 'G','管理','专科','1987-2-1',dbo.ageTime('1987-2-1') union all
select 'H','操作','专科','1976-2-1',dbo.ageTime('1976-2-1')

select * from #tb
go
--适合于2005以上的
select 部门,年龄段,sum(高中),sum([初中]),sum([本科])
from
(
select 部门,年龄段,高中,初中,本科
from #tb pivot(count(姓名) for 学历 in([高中],[初中],[本科])) as t
) as tb group by 部门,年龄段
go
--sql2000以上的
--用union all

declare @sql varchar(8000)
set @sql = 'select 部门,年龄段'
select @sql = @sql + ' , sum(case 学历 when ''' + 学历 + ''' then 1 else 0 end) [' + 学历 + ']'
from (select distinct 学历 from #tb) as a
set @sql = @sql + ' from #tb group by 部门,年龄段'
exec(@sql)
qqzeng-ip 2010-02-03
  • 打赏
  • 举报
回复
--忘记年龄段了 用datediff函数 自己加上
qqzeng-ip 2010-02-03
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2010-02-03 14:32:08
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([姓名] varchar(1),[部门] varchar(4),[学历] varchar(4),[出生年月] datetime)
insert [tb]
select 'A','后勤','高中','1986-1-1' union all
select 'B','后勤','初中','1984-3-7' union all
select 'C','管理','本科','1987-2-1' union all
select 'D','操作','专科','1976-2-1'
--------------开始查询--------------------------
declare @sql varchar(8000)
set @sql = 'select 部门'
select @sql = @sql + ' , sum(case 学历 when ''' + 学历 + ''' then 1 else 0 end) [' + 学历 + ']'
from (select distinct 学历 from tb) as a
set @sql = @sql + ' from tb group by 部门'
exec(@sql)
----------------结果----------------------------
/* 部门 本科 初中 高中 专科
---- ----------- ----------- ----------- -----------
操作 0 0 0 1
管理 1 0 0 0
后勤 0 1 1 0

(3 行受影响)

*/
kele1006 2010-02-03
  • 打赏
  • 举报
回复
到数据库专区,有人5分钟给你结果!有点工作量,但是不是很繁琐

通过case when 、group、datediff,行转列可处理完毕
sdnjiejie65 2010-02-03
  • 打赏
  • 举报
回复
你用是的什么数据库?
tianxiawusuan 2010-02-03
  • 打赏
  • 举报
回复
UP
tianxiawusuan 2010-02-03
  • 打赏
  • 举报
回复
UP

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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