SQL GROUP BY语句分组错误

intrepid04 软件开发  2017-12-06 03:22:40
SELECT YSSKMJ.EmpNO, YSSKMJ.RdJCZT, YSSKMJ.SKTime
FROM YSSKMJ WHERE CONVERT(decimal(14, 0), YSSKMJ.SKTime)IN (SELECT MAX(CONVERT(decimal(14, 0), YSSKMJ.SKTime))
FROM YSSKMJ WHERE CONVERT(decimal(10, 0), YSSKMJ.EmpNo) <> 0000000848
GROUP BY CONVERT(decimal(10, 0), YSSKMJ.EmpNo))

执行结果如下:

我是按人员编号EmpNO进行分组的,结果出来好多组都是0000000848的记录,是我的语句有问题还是数据库出了问题?这个0000000848是某员工曾经的一卡通号码,丢失后办了新号码但是每当有人刷卡进出系统都会自动录入一个0000000848的记录。具体的几张表之间的逻辑关系如下:

//部门结构表:部门编号、部门名称、父级部门编号
CREATE TABLE [Dept] (
[DeptNo] integer, ‘部门编号
[DeptName] VarChar(30), ‘部门名称
[ParentNo] integer, ‘父级部门编号
PRIMARY KEY([DeptNo])
)

//员工表:
// 人员编号/序列号/卡号/维根号
// 是否发卡(已发0未发1待补2)、卡有效期、发卡状态(未发卡0已发卡1已注销2)、注销时间、IC卡类型(IC1/手机卡2)、
// 姓名、性别(男0女1)、所属部门编号、
// 职位名称、岗位级别
// 身份证号(15或18)、手机号码、联系电话、家庭住址、暂住地址
// 入职时间、离职时间、考勤开始时间
// 员工类别(在职/学生0、借调/教师1、实习2、离职3、访客4、其它5)、在职身份(正式0合同1临时2)
// 住宿类别(不住宿0、住宿1)
// 工种
// 考勤类别(不刷卡0、任意刷一次1、按班次时间点刷2、按实际刷3、按首末刷卡计4)
create table [Employee] (
[EmpNo] VarChar(20) not null, ‘人员编号
[CardXLH] VarChar(10) NULL, ‘卡号
[CardKH] VarChar(10) NULL, ‘序列号
[CardBY] VarChar(10) NULL, ‘维根号

[IsSendCard] VarChar(1) NULL, ‘0-在职,1-离职
[CardValidTime] VarChar(14) NULL, ‘卡有效期
[IsCardZX] VarChar(1) NULL, ‘发卡状态, 未发卡0已发卡1已注销2
[IsCardZXTime] VarChar(14) NULL, ‘注销时间

[XM] VarChar(20) NULL, ‘姓名
[XB] Varchar(1) NULL, ‘性别(男0女1)
[DeptNo] integer, ‘所属部门编号

[ZWName] VarChar(40) NULL, ‘职位名称
[ZWLevel] VarChar(10) NULL, ‘岗位级别
[SFZ] Varchar(18) NULL, ‘身份证号(15或18)
[MobilNum] Varchar(15) NULL, ‘手机号码
[LXDH] VarChar(50) NULL, ‘联系电话
[JTZZ] VarChar(50) NULL, ‘家庭住址
[ZZDZ] VarChar(50) NULL, ‘暂住地址

[RZSJ] VarChar(8) NULL, ‘入职时间
[LZSJ] Varchar(8) NULL, ‘离职时间
[KQKSSJ] VarChar(8) NULL, ‘考勤开始时间

[YGLB] VarChar(1) NULL, ‘员工类别(在职/学生0、借调/教师1、实习2、离职3、访客4、其它5)
[YGGZ] VarChar(20) NULL,
[ZZSF] integer default 0, ‘在职身份(正式0合同1临时2)
[ZSLB] integer default 0, ‘住宿类别(不住宿0、住宿1)

[KQLB] Varchar(1) NULL, ‘考勤类别(不刷卡0、任意刷一次1、按班次时间点刷2、按实际刷3、按首末刷卡计4)

[Photo] image null,
primary key([EmpNo])
)

//门禁原始刷卡表:员工编号、卡号码、卡类型(卡号0序列号1变种号2)、采集时间、刷卡时间、门控机号、门号、区域号、
// 读头号、进出状态(无0进1出2)、并用业务、
// 通行方法-事件(未注册-1按钮2刷卡3刷卡/密码4编号/密码5
// 强制11超级密码13胁迫密码14非法闯入15 门磁开16门磁闭17门未关报警18强制锁门19火警20防盗21端子一信号25端子二信号26其它30)、
// 判断结果(无效1正常执行2拒绝3)
CREATE TABLE [YSSKMJ] (
[ID] int IDENTITY (1, 1) NOT NULL ,
[EmpNo] VarChar(20), ‘员工编号
[CardNo] VarChar(10), ‘卡号码
[CardType] VarChar(1), ‘卡类型(卡号0序列号1变种号2)
[GaTime] VarChar(14), ‘采集时间
[SKTime] VarChar(14), ‘刷卡时间
[Addr] VarChar(15),
[JH] VarChar(15),
[DoorNo] Integer, ‘门号
[AreaNo] Integer, ‘区域号
[RdH] VarChar(5), ‘读头号
[RdJCZT] VarChar(1), ‘进出状态(无0进1出2)
[RdSKBusi] VarChar(20), ‘并用业务
[TXType] VarChar(2), ‘通行方法-事件(未注册-1按钮2刷卡3刷卡密码4编号/密码5强制11超级密码13胁迫密码14非法闯入15 门磁开16门磁闭17门未关报警18强制锁门19火警20防盗21端子一信号25端子二信号26其它30)
[PDJG] VarChar(1), ‘判断结果(无效1正常执行2拒绝3)
[Photo] image null,
PRIMARY KEY([ID])
)
...全文
377 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
intrepid04 2017-12-06
谢谢楼上的各位,我明天试一下
  • 打赏
  • 举报
回复
RINK_1 2017-12-06

 SELECT * FROM YSSKMJ A
 WHERE NOT EXISTS (SELECT 1 FROM YSSKMJ WHERE EmpNo=A.EmpNo AND SKTime>A.SKTime)
 AND EmpNo<>'0000000848'

  • 打赏
  • 举报
回复
中国风 2017-12-06
以EmpNo 分组取最大一条记录这样用 e.g.
SELECT  *
FROM    ( SELECT    * ,
                    ROW_NUMBER() OVER ( PARTITION BY EmpNo ORDER BY SKTime DESC ) AS RN
          FROM      YSSKMJ
        ) AS a
WHERE   RN = 1;
  • 打赏
  • 举报
回复
听雨停了 2017-12-06

SELECT a.EmpNO,
       a.RdJCZT,
       a.SKTime
FROM   YSSKMJ a
INNER JOIN (
	SELECT CONVERT(DECIMAL(10, 0), YSSKMJ.EmpNo) AS EmpNo,MAX(CONVERT(DECIMAL(14, 0), YSSKMJ.SKTime))
               FROM   YSSKMJ
               WHERE  CONVERT(DECIMAL(10, 0), YSSKMJ.EmpNo) <> 0000000848
               GROUP BY
                      CONVERT(DECIMAL(10, 0), YSSKMJ.EmpNo)	
) b ON CONVERT(DECIMAL(10, 0), a.EmpNo)=b.EmpNo
这样试试看看
  • 打赏
  • 举报
回复
相关推荐
发帖
应用实例
加入

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2017-12-06 03:22
社区公告
暂无公告