| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 594 人关注过本帖
标题:sql 统计问题
只看楼主 加入收藏
ivantse
Rank: 1
等 级:等待验证会员
帖 子:16
专家分:0
注 册:2010-10-18
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:5 
sql 统计问题
有以下两张表:
员工表
CREATE TABLE [dbo].[tblEmployee] (
    员工编号 [EmployeeID] [int] IDENTITY (1, 1) NOT NULL ,
    姓名 [Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    登陆名 [LoginName] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    密码 [Password] [binary] (20) NULL ,
    EMAIL [Email] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    部门编号 [DeptID] [int] NULL ,
    基本工资 [BasicSalary] [int] NULL ,
    备注 [Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    电话 [Telephone] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    注册日期 [OnboardDate] [datetime] NOT NULL ,
    自我介绍 [SelfIntro] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
    年假剩余小时数 [VacationRemain] [int] NULL ,
    用户级别 [EmployeeLevel] [int] NULL ,
    照片 [PhotoImage] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

加班申请表
CREATE TABLE [dbo].[tblOvertime] (
    加班申请编号[OvertimeID] [int] IDENTITY (1, 1) NOT NULL ,
    申请员工编号[EmployeeID] [int] NOT NULL ,
    审批者编号[ApproverID] [int] NULL ,
    提交时间[SubmitTime] [datetime] NOT NULL ,
    加班开始时间[StartTime] [datetime] NOT NULL ,
    加班结束时间[EndTime] [datetime] NOT NULL ,
    事由[Reason] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    审批状态[Status] [nchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL , //四种状态:已提交,已否决,已取消,已批准
    加班类型[Type] [tinyint] NULL ,  //两种类型:折算成年假,折算成津贴
    否决理由[DenyReason] [nchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
    加班小时数[Hours] [int] NULL
) ON [PRIMARY]

根据登录了该系统的用户的LoginName查出与该用户同一个部门(即DeptID相同)所有员工的加班情况,我想查出的表的结构如下:

 员工姓名    加班次数    加班总小时数
testName1       2            5
testName2       1            2
testName3       0            0
testName4       3            7

补充:审批状态[Status]  为:已取消 或 已否决  或 已提交 的不算一次加班,只有 Status 为 已批准 是才算

下面的语句,查出的结果 不包括 没有加班的员工,我想要的结果要包括没加过班的员工,没加过班的员工的 加班次数和 加班总小时数 都显示为 0
select tblEmployee.EmployeeID,tblEmployee.[Name],
count(case when tblOvertime.Status='已批准' then 1 else null end) 加班次数,
Sum(case when tblOvertime.Status='已批准' then tblOvertime.Hours else 0 end) 总小时数
from tblEmployee inner join tblOvertime on tblEmployee.EmployeeID=
tblOvertime.EmployeeID where tblEmployee.DeptID  
in(select tblEmployee.DeptID from tblEmployee where tblEmployee.LoginName=@LoginName)
group by tblEmployee.EmployeeID,tblEmployee.[Name]

要查出包括没加过班的应怎样?希望大家帮个忙,在此先谢谢了!!


搜索更多相关主题的帖子: 统计 sql 
2010-10-24 15:04
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:1 
统计语句where子句中用一个IN子查询(该子查询查出加过班的人,没加过班的就用NOT IN)

★★★★★为人民服务★★★★★
2010-10-24 20:42
tangyunzhong
Rank: 5Rank: 5
来 自:广西
等 级:职业侠客
威 望:4
帖 子:97
专家分:364
注 册:2010-7-28
收藏
得分:4 
回复 楼主 ivantse
下面的语句是能满足你的需求,但多出了一个字段,EmployeeID字段是防止有姓名一样而设的:
 select a.EmployeeID,max([Name]) as 'Name',count(hours) as '加班次数',
(case when sum(Hours)is null then 0
else sum(Hours) end) as '加班总小时数'
from tblEmployee a left join tblOvertime b on a.EmployeeID=b.EmployeeID and Status=N'已批准'
where a.DeptID=(select DeptID from tblEmployee where loginname = @LoginName)
group by a.EmployeeID

语句是如上面的意思所写,但是我用你的表结构测试有点问题(现还没有找到问题出在哪里),如下写就能成功:
select a.EmployeeID,max([Name]) as 'Name',count(hours) as '加班次数',(case when sum(Hours)is null then 0 else sum(Hours) end) as '加班总小时数' from tblEmployee a left join tblOvertime b on a.EmployeeID=b.EmployeeID and Status=N'已批准'
where a.DeptID=(select DeptID from tblEmployee where loginname = N'XXX')
group by a.EmployeeID
'XXX'代表姓名

[ 本帖最后由 tangyunzhong 于 2010-10-24 22:09 编辑 ]
2010-10-24 21:37
ivantse
Rank: 1
等 级:等待验证会员
帖 子:16
专家分:0
注 册:2010-10-18
收藏
得分:0 
回复 3楼 tangyunzhong
第一种方法也可以,我试过了,谢谢!我这个项目还有很多地方不会的,谢谢你的帮忙!
2010-10-24 23:25
tangyunzhong
Rank: 5Rank: 5
来 自:广西
等 级:职业侠客
威 望:4
帖 子:97
专家分:364
注 册:2010-7-28
收藏
得分:0 
回复 4楼 ivantse
你现在在做什么项目啊,能不能给我也分享啊!
2010-10-25 07:27
ivantse
Rank: 1
等 级:等待验证会员
帖 子:16
专家分:0
注 册:2010-10-18
收藏
得分:0 
回复 5楼 tangyunzhong
一个人力资源管理系统
2010-10-25 11:05
快速回复:sql 统计问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020417 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved