SQL2000 按班级分类,统计人数,未考勤人数

zjbeva025 2019-03-11 11:56:24
SQL2000 统计分析
有如下表
表1
班级 姓名编号 姓名
一班 1001 李三
一班 1002 张明
一班 1003 阿四
二班 1004 小明
二班 1005 阿小
三班 1006 小何
考勤表
姓名编号 班级 时间
1001 一班 08:30
1002 一班 08:30
1004 二班 08:30
1005 二班 08:30
1006 三班 08:30
统计格式如下

班级 人数 未考勤人数
一班 3 1
二班 2 0
三班 1 0

按班级分类,统计人fi果级人员在考勤表没有记录时。显示未考勤人数,有记录就不显示。
...全文
231 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dear SQL(燊) 2019-03-13
  • 打赏
  • 举报
回复
count(distinct a.姓名编号)
select a.班级,人数=count(distinct a.姓名编号),未考勤人数=sum(case when b.时间 is null then 1 else 0 end )
from #t1 a
left join #t2 b on  a.姓名编号=b.姓名编号
group by a.班级
Dear SQL(燊) 2019-03-13
  • 打赏
  • 举报
回复
引用 5 楼 zjbeva025 的回复:
[quote=引用 2 楼 Dear SQL 的回复:]
if object_id('tempdb..#t1') is not null drop table #t1;
if object_id('tempdb..#t2') is not null drop table #t2;

select 班级='一班',姓名编号=N'1001',姓名='李三' into #t1 union all
select 班级='一班',姓名编号=N'1002',姓名='张明' union all
select 班级='一班',姓名编号=N'1003',姓名='阿四' union all
select 班级='二班',姓名编号=N'1004',姓名='小明' union all
select 班级='二班',姓名编号=N'1005',姓名='阿小' union all
select 班级='三班',姓名编号=N'1006',姓名='小何' 

select 姓名编号=N'1001',班级='一班',时间='08:30' into #t2 union all
select 姓名编号=N'1002',班级='一班',时间='08:30' union all
select 姓名编号=N'1004',班级='二班',时间='08:30' union all
select 姓名编号=N'1005',班级='二班',时间='08:30' union all
select 姓名编号=N'1006',班级='三班',时间='08:30' 

select a.班级,人数=count(*),未考勤人数=sum(case when b.时间 is null then 1 else 0 end )
from #t1 a
left join #t2 b on  a.姓名编号=b.姓名编号
group by a.班级
如果考勤表插入多条数据统计就不对了. Create table #考勤表([姓名编号] int,[班级] nvarchar(22),[时间] nvarchar(22)) Insert #考勤表 select 1001,N'一班','08:30' union all select 1002,N'一班','08:30' union all select 1004,N'二班','08:30' union all select 1005,N'二班','08:30' union all select 1006,N'三班','08:30' union all select 1001,N'一班','08:30' union all select 1002,N'一班','08:30' union all select 1004,N'二班','08:30' union all select 1005,N'二班','08:30' union all select 1006,N'三班','08:30' union all select 1001,N'一班','08:30' union all select 1002,N'一班','08:30' union all select 1004,N'二班','08:30' union all select 1005,N'二班','08:30' union all select 1006,N'三班','08:30' union all select 1001,N'一班','08:30' union all select 1002,N'一班','08:30' union all select 1004,N'二班','08:30' union all select 1005,N'二班','08:30' union all select 1006,N'三班','08:30'[/quote]
if object_id('tempdb..#t1') is not null drop table #t1;
if object_id('tempdb..#t2') is not null drop table #t2;
 
select 班级='一班',姓名编号=N'1001',姓名='李三' into #t1 union all
select 班级='一班',姓名编号=N'1002',姓名='张明' union all
select 班级='一班',姓名编号=N'1003',姓名='阿四' union all
select 班级='二班',姓名编号=N'1004',姓名='小明' union all
select 班级='二班',姓名编号=N'1005',姓名='阿小' union all
select 班级='三班',姓名编号=N'1006',姓名='小何' 
 
select 姓名编号=N'1001',班级='一班',时间='08:30' into #t2 union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30'
 
select a.班级,人数=count(distinct b.姓名编号),未考勤人数=sum(case when b.时间 is null then 1 else 0 end )
from #t1 a
left join #t2 b on  a.姓名编号=b.姓名编号
group by a.班级
/*
班级   人数          未考勤人数
---- ----------- -----------
二班   2           0
三班   1           0
一班   2           1

*/
  • 打赏
  • 举报
回复
select #t1.班级,COUNT(#t2.姓名编号) 人数,COUNT(case when #t2.姓名编号 is null then 1 else null end) 未考勤人数 from #t1 left join #t2 on #t1.姓名编号=#t2.姓名编号 group by #t1.班级 和 select #t1.班级,COUNT(isnull(#t2.姓名编号,'')) 人数,COUNT(isnull(#t2.姓名编号,''))-COUNT(#t2.姓名编号) 未考勤人数 from #t1 left join #t2 on #t1.姓名编号=#t2.姓名编号 group by #t1.班级 二个都行。
woniugongzuoshi 2019-03-12
  • 打赏
  • 举报
回复
select 班级,count(distinct 姓名编号) as 人数,count(distinct 姓名编号)-isnull((select count(distinct 姓名编号) from 考勤表 where 班级=表1.班级),0) as 未考勤人数 from 表1 group by 班级
zjbeva025 2019-03-12
  • 打赏
  • 举报
回复
引用 2 楼 Dear SQL 的回复:
if object_id('tempdb..#t1') is not null drop table #t1;
if object_id('tempdb..#t2') is not null drop table #t2;

select 班级='一班',姓名编号=N'1001',姓名='李三' into #t1 union all
select 班级='一班',姓名编号=N'1002',姓名='张明' union all
select 班级='一班',姓名编号=N'1003',姓名='阿四' union all
select 班级='二班',姓名编号=N'1004',姓名='小明' union all
select 班级='二班',姓名编号=N'1005',姓名='阿小' union all
select 班级='三班',姓名编号=N'1006',姓名='小何'

select 姓名编号=N'1001',班级='一班',时间='08:30' into #t2 union all
select 姓名编号=N'1002',班级='一班',时间='08:30' union all
select 姓名编号=N'1004',班级='二班',时间='08:30' union all
select 姓名编号=N'1005',班级='二班',时间='08:30' union all
select 姓名编号=N'1006',班级='三班',时间='08:30'

select a.班级,人数=count(*),未考勤人数=sum(case when b.时间 is null then 1 else 0 end )
from #t1 a
left join #t2 b on a.姓名编号=b.姓名编号
group by a.班级

如果考勤表插入多条数据统计就不对了.
Create table #考勤表([姓名编号] int,[班级] nvarchar(22),[时间] nvarchar(22))
Insert #考勤表
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30'
二月十六 2019-03-12
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#表1') is null
drop table #表1
Go
Create table #表1([班级] nvarchar(22),[姓名编号] int,[姓名] nvarchar(22))
Insert #表1
select N'一班',1001,N'李三' union all
select N'一班',1002,N'张明' union all
select N'一班',1003,N'阿四' union all
select N'二班',1004,N'小明' union all
select N'二班',1005,N'阿小' union all
select N'三班',1006,N'小何'
GO
if not object_id(N'Tempdb..#考勤表') is null
drop table #考勤表
Go
Create table #考勤表([姓名编号] int,[班级] nvarchar(22),[时间] Date)
Insert #考勤表
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30'
Go
--测试数据结束
SELECT #表1.班级,
COUNT(1) AS 人数,
SUM( CASE
WHEN #考勤表.姓名编号 IS NULL THEN
1
ELSE
0
END
) 未考勤人数
FROM #表1
LEFT JOIN #考勤表
ON #考勤表.姓名编号 = #表1.姓名编号
GROUP BY #表1.班级;


Dear SQL(燊) 2019-03-12
  • 打赏
  • 举报
回复
if object_id('tempdb..#t1') is not null drop table #t1;
if object_id('tempdb..#t2') is not null drop table #t2;

select 班级='一班',姓名编号=N'1001',姓名='李三' into #t1 union all
select 班级='一班',姓名编号=N'1002',姓名='张明' union all
select 班级='一班',姓名编号=N'1003',姓名='阿四' union all
select 班级='二班',姓名编号=N'1004',姓名='小明' union all
select 班级='二班',姓名编号=N'1005',姓名='阿小' union all
select 班级='三班',姓名编号=N'1006',姓名='小何' 

select 姓名编号=N'1001',班级='一班',时间='08:30' into #t2 union all
select 姓名编号=N'1002',班级='一班',时间='08:30' union all
select 姓名编号=N'1004',班级='二班',时间='08:30' union all
select 姓名编号=N'1005',班级='二班',时间='08:30' union all
select 姓名编号=N'1006',班级='三班',时间='08:30' 

select a.班级,人数=count(*),未考勤人数=sum(case when b.时间 is null then 1 else 0 end )
from #t1 a
left join #t2 b on  a.姓名编号=b.姓名编号
group by a.班级
Dear SQL(燊) 2019-03-12
  • 打赏
  • 举报
回复

;
with t1 as( 
	select 班级='一班',姓名编号=N'1001',姓名='李三' union all
	select 班级='一班',姓名编号=N'1002',姓名='张明' union all
	select 班级='一班',姓名编号=N'1003',姓名='阿四' union all
	select 班级='二班',姓名编号=N'1004',姓名='小明' union all
	select 班级='二班',姓名编号=N'1005',姓名='阿小' union all
	select 班级='三班',姓名编号=N'1006',姓名='小何' 
),t2 as(    
	select 姓名编号=N'1001',班级='一班',时间='08:30' union all
	select 姓名编号=N'1002',班级='一班',时间='08:30' union all
	select 姓名编号=N'1004',班级='二班',时间='08:30' union all
	select 姓名编号=N'1005',班级='二班',时间='08:30' union all
	select 姓名编号=N'1006',班级='三班',时间='08:30' 
)
select a.班级,人数=count(*),未考勤人数=sum(case when b.时间 is null then 1 else 0 end )
from t1 a
left join t2 b on  a.姓名编号=b.姓名编号
group by a.班级

/*
班级   人数          未考勤人数
---- ----------- -----------
二班   2           0
三班   1           0
一班   3           1

(3 行受影响)


*/

zjbeva025 2019-03-12
  • 打赏
  • 举报
回复
引用 3 楼 二月十六 的回复:
--测试数据
if not object_id(N'Tempdb..#表1') is null
drop table #表1
Go
Create table #表1([班级] nvarchar(22),[姓名编号] int,[姓名] nvarchar(22))
Insert #表1
select N'一班',1001,N'李三' union all
select N'一班',1002,N'张明' union all
select N'一班',1003,N'阿四' union all
select N'二班',1004,N'小明' union all
select N'二班',1005,N'阿小' union all
select N'三班',1006,N'小何'
GO
if not object_id(N'Tempdb..#考勤表') is null
drop table #考勤表
Go
Create table #考勤表([姓名编号] int,[班级] nvarchar(22),[时间] Date)
Insert #考勤表
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30'
Go
--测试数据结束
SELECT #表1.班级,
COUNT(1) AS 人数,
SUM( CASE
WHEN #考勤表.姓名编号 IS NULL THEN
1
ELSE
0
END
) 未考勤人数
FROM #表1
LEFT JOIN #考勤表
ON #考勤表.姓名编号 = #表1.姓名编号
GROUP BY #表1.班级;






如果考勤表插入多条数据统计就不对了.
Create table #考勤表([姓名编号] int,[班级] nvarchar(22),[时间] nvarchar(22))
Insert #考勤表
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30' union all
select 1001,N'一班','08:30' union all
select 1002,N'一班','08:30' union all
select 1004,N'二班','08:30' union all
select 1005,N'二班','08:30' union all
select 1006,N'三班','08:30'


实 验 报 告 课程名称: 数据库系统概论 实验名称: 数据定义 院 (系): 管理学院 专业班级: 姓 名: 学 号: 指导教师: 张新生 2011年6 月 9 日 一、实验目的和要求 目的: 1、掌握SELECT语句的基本语法 2、掌握子查询的表示 3、掌握连接查询的表示 4、掌握SELECT语句的统计函数的作用 5、掌握SELECT语句的GROUPBY和ORDERBY子句的作用和使用方法。 要求: 1、了解SELECT语句的基本语法格式 2、了解SELECT语句的执行方法 3、了解子查询的表示方法 4、了解SELECT语句统计函数的作用 5、了解SELECT语句的GROUPBY和ORDERBY子句的作用。 二、实验内容和原理 首先启动sql server查询分析器,并以系统管理员sa身份连接到SQL Server以下的所有查询都在查询分析器中执行。 1、select语句的基本使用 (1)、根据实验二给出的数据表结构,查询每个职工的职工号、姓名、缺勤天数信息 (2)查询职工号为001的职工的姓名和缺勤天数。 (3)查询所有姓"李"的职工的职工号、缺勤理由。 (4)找出所有缺勤天数在2~3天之间的职工号。 2.SELECT语句的高级查询使用 (1)查询缺勤名称为"病假"的职工的职工号和姓名。 (2)查找缺勤天数为2天的职工的职工号和缺勤名称。 (3)查询"事假"的总人数。 (4)求各缺勤类别的人数。 (5)将各职工的考勤情况按缺勤天数由高到低排序。 四、实验步骤 1、写出SELECT语句 2、执行语句 3、运行语句 五、实验结果及分析 注意Select语句的格式 六、讨论 七、结论 八、教师评语和成绩 教师签名: 年 月 日
25175中学工资管理系统功能简介: 教职工利用身份证号码和密码可以查询某月份的工资。有修改自己密码权限。 财务管理员可以导入某月份的工资表,可以查询和删除某月份的工资总表。有自己的帐号,密码,可以针对某条做修改。 加班费管理员可以导入某月份的加班费,可以查询和删除某月份的加班费总表。有自己的帐号,密码,可以针对某条做修改。   管理人员管理全部数据。 excel导入表信息:序号 姓名 性别 部门 身份证号 工资卡号 Excel导入,中学2013年3月加班费:序号 姓名 身份证号码 职务津贴 行政 课时结构费 超课时费 早读费 晚自习费 考勤 考勤备注(文本) 合计 备用字段1(数值) 备用字段2(数值) 备用字段3(文本)   Excel导入:统一工资发放一览表(事业类型工资): 账号 序列 姓名 身份证 应发工资小计 岗位工资 薪级工资 高定工资 保留地区补贴 保留地区补贴保留额 国家艰苦边远地区津贴 岗位津贴 纳入绩效工资的活工资 绩效工资 补发工资 (个人)基本医疗保险 (个人)事业单位失业保险 (个人)大病医疗救助金 (个人)住房公积金 个人所得税 代扣1 代扣2 应发总额合计 实发总额合计   统计人数 财务人员和加班费管理人员的账号和管理后台 班费里的考勤字段,不能为负数   配置说明: 1.新建数据库N25175_GZ 通过备份文件N25175_GZ还原数据库 2.修改数据库配置文件 用记事本打开发布网站里的web.config文件 然后修改该节点的信息(用于连接配置数据库)   各节点说明: Connectionstring 里 Server= 数据库服务器地址(ip 或 网址) User id=连接数据库的用户名 Password=连接数据库的密码 Initial catalog=数据库名字 然后保存。   管理员登录帐号25175 密码a25175com   运行环境:.net2.0 sql2000 Windows 2003 / 2000 / XP ista iis5.0以上 ASPAJAXExtSetup.msi(2.0)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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