求个SQL查询

fyxi 2005-04-21 06:03:18
表1 xg_Class
ClassNO SpotNo EmpName Stime Etime
1 XJ001 张三 2005-03-11 8:00 2005-03-11 9:00
1 XJ002 张三 2005-03-11 8:00 2005-03-11 9:00
1 XJ003 张三 2005-03-11 8:00 2005-03-11 9:00
1 XJ004 张三 2005-03-11 8:00 2005-03-11 9:00

2 XJ005 李四 2005-03-11 12:00 2005-03-11 14:00
2 XJ006 李四 2005-03-11 12:00 2005-03-11 14:00
2 XJ007 李四 2005-03-11 12:00 2005-03-11 14:00
2 XJ008 李四 2005-03-11 12:00 2005-03-11 14:00


表2 xg_RECORD
ID spotNo EmpName CardNo Ptime
1 XJ001 张三 00104299 2005-03-11 8:10
2 XJ002 张三 00104299 2005-03-11 8:25
3 XJ002 张三 00104299 2005-03-11 8:30 ***

4 XJ005 李四 00105716 2005-03-11 12:35
5 XJ006 李四 00105716 2005-03-11 13:40
6 XJ008 李四 00105716 2005-03-11 14:05

***//注意,这里的数据与第2条的potNo 和 EmpName重复,查询的时候不显示出来,
然后就是xg_Record表里对应xg_Class里没有显示为 null

怎么通过查询得出下面表3这样的形式?不用临时表是否可以实现?
我原来用LEFT JION 但是结果的数据老是不匹配

表3 XG_STAR
ID SpotNO EmpName Stime ETime PTme
1 XJ001 张三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11 8:10
2 XJ002 张三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11 8:25
3 XJ003 张三 2005-03-11 8:00 2005-03-11 9:00 NUll
4 XJ004 张三 2005-03-11 8:00 2005-03-11 9:00 NUll

5 XJ005 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11 11:15
6 XJ006 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11 13:40
7 XJ007 李四 2005-03-11 12:00 2005-03-11 14:00 Null
8 XJ008 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11 14:05
...全文
131 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyxi 2005-04-21
  • 打赏
  • 举报
回复
是啊,这个是麻烦,也长,我想了几天了,都没出来
fyxi 2005-04-21
  • 打赏
  • 举报
回复
表1 xg_Class
ClassNO SpotNo EmpName Stime Etime ClassState
1 XJ001 张三 2005-03-11 8:00 2005-03-11 9:00 0
1 XJ002 张三 2005-03-11 8:00 2005-03-11 9:00 0
1 XJ003 张三 2005-03-11 8:00 2005-03-11 9:00 0
1 XJ004 张三 2005-03-11 8:00 2005-03-11 9:00 0

2 XJ005 李四 2005-03-11 12:00 2005-03-11 14:00 0
2 XJ006 李四 2005-03-11 12:00 2005-03-11 14:00 0
2 XJ007 李四 2005-03-11 12:00 2005-03-11 14:00 0
2 XJ008 李四 2005-03-11 12:00 2005-03-11 14:00 0

3 XJ002 张三 2005-03-11 8:00 2005-03-11 9:00 1



表2 xg_RECORD
ID spotNo EmpName CardNo Ptime
1 XJ001 张三 00104299 2005-03-11 8:10
2 XJ002 张三 00104299 2005-03-11 8:25
3 XJ002 张三 00104299 2005-03-11 8:30 ***

4 XJ005 李四 00105716 2005-03-11 12:35
5 XJ006 李四 00105716 2005-03-11 13:40
6 XJ008 李四 00105716 2005-03-11 14:05

***

表3 XG_STAR
ID ClassNO SpotNO EmpName Stime ETime PTme ClassState
1 1 XJ001 张三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11 8:10 0
2 1 XJ002 张三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11 8:25 0
3 1 XJ003 张三 2005-03-11 8:00 2005-03-11 9:00 NUll 0
4 1 XJ004 张三 2005-03-11 8:00 2005-03-11 9:00 NUll 0

5 2 XJ005 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11 11:15 0
6 2 XJ006 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11 13:40 0
7 2 XJ007 李四 2005-03-11 12:00 2005-03-11 14:00 Null 0
8 2 XJ008 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11 14:05 0

9 3 XJ003 张三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11 8:30 1 ****


谢谢一天倒晚游泳的鱼,你写的完全符合我的要求。
winternet(冬天) ( ) 的方法也可以,但是我还是觉得paoluo(一天到晚游泳的鱼) 的方法最好。因为是统计,我原来考虑的问题不是很全,现在要求加了一点,你能不能再帮我考虑一下.
是这样的,原来是有重复的就不显示出来,现在想这样,打***那条也会利用上,只是后来统计的显示倒CLASSSTATE为1的那项里,如果当 0 和 1 都有记录的时候,
那条继续才过虑掉,
也就是说,如果有三条类是***这样的记录,第三条才会被过虑,第一条进入 ClassState为0 的,第一条进入 ClassState为 1 的,
不知道存SQL是否能实现。
郭大侠_ 2005-04-21
  • 打赏
  • 举报
回复
好长啊,看的眼睛疼!
winternet 2005-04-21
  • 打赏
  • 举报
回复
select a.*,xx=case when exists(select 1 from (select * from xg_Record where ID in (select min(ID) from xg_Record group by spotNO,EmpName))b
where a.spotNo=b.spotno and a.EmpName=b.EmpName)
then ( select convert(char(10),b.Ptime,120)
from (select * from xg_Record where ID in (select min(ID) from xg_Record group by spotNO,EmpName))b
where a.spotNo=b.spotno and a.EmpName=b.EmpName)
else null
end
from xg_Class as a

--結果:
ClassNO SpotNo EmpName Stime Etime xx
---------- ---------- ---------- -------------------- -------------------- ----------
1 XJ001 張三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11
1 XJ002 張三 2005-03-11 8:00 2005-03-11 9:00 2005-03-11
1 XJ003 張三 2005-03-11 8:00 2005-03-11 9:00 NULL
1 XJ004 張三 2005-03-11 8:00 2005-03-11 9:00 NULL
2 XJ005 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11
2 XJ006 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11
2 XJ007 李四 2005-03-11 12:00 2005-03-11 14:00 NULL
2 XJ008 李四 2005-03-11 12:00 2005-03-11 14:00 2005-03-11
paoluo 2005-04-21
  • 打赏
  • 举报
回复
--建立测试环境
Create table xg_Class
(ClassNO Int,
SpotNo Varchar(10),
EmpName NVarchar(10),
Stime DateTime,
Etime DateTime)

Create table xg_RECORD
(ID Int,
spotNo Varchar(10),
EmpName NVarchar(10),
CardNo Varchar(10),
Ptime DateTime)
GO
--插入数据
Insert xg_Class Values(1, 'XJ001', N'张三', '2005-03-11 8:00', '2005-03-11 9:00')
Insert xg_Class Values(1, 'XJ002', N'张三', '2005-03-11 8:00', '2005-03-11 9:00')
Insert xg_Class Values(1, 'XJ003', N'张三', '2005-03-11 8:00', '2005-03-11 9:00')
Insert xg_Class Values(1, 'XJ004', N'张三', '2005-03-11 8:00', '2005-03-11 9:00')
Insert xg_Class Values(2, 'XJ005', N'李四', '2005-03-11 12:00', '2005-03-11 14:00')
Insert xg_Class Values(2, 'XJ006', N'李四', '2005-03-11 12:00', '2005-03-11 14:00')
Insert xg_Class Values(2, 'XJ007', N'李四', '2005-03-11 12:00', '2005-03-11 14:00')
Insert xg_Class Values(2, 'XJ008', N'李四', '2005-03-11 12:00', '2005-03-11 14:00')

Insert xg_RECORD Values(1, 'XJ001', N'张三', '00104299', '2005-03-11 8:10')
Insert xg_RECORD Values(2, 'XJ002', N'张三', '00104299', '2005-03-11 8:25')
Insert xg_RECORD Values(3, 'XJ002', N'张三', '00104299', '2005-03-11 8:30')
Insert xg_RECORD Values(4, 'XJ005', N'李四', '00105716', '2005-03-11 12:35')
Insert xg_RECORD Values(5, 'XJ006', N'李四', '00105716', '2005-03-11 13:40')
Insert xg_RECORD Values(6, 'XJ008', N'李四', '00105716', '2005-03-11 14:05')
GO
--测试
Select
Right(A.SpotNO,1) As ID,
A.SpotNO,
A.EmpName,
A.Stime,
A.ETime,
B.Ptime
from xg_Class A
Left Join
(Select * from xg_RECORD T Where Not Exists (Select * from xg_RECORD Where spotNo=T.spotNo And ID<T.ID)) B
On A.spotNo=B.spotNo
Order By ID
--删除测试环境
Drop table xg_Class,xg_RECORD
--结果
/*
ID SpotNO EmpName Stime ETime Ptime
1 XJ001 张三 2005-03-11 08:00:00.000 2005-03-11 09:00:00.000 2005-03-11 08:10:00.000
2 XJ002 张三 2005-03-11 08:00:00.000 2005-03-11 09:00:00.000 2005-03-11 08:25:00.000
3 XJ003 张三 2005-03-11 08:00:00.000 2005-03-11 09:00:00.000 NULL
4 XJ004 张三 2005-03-11 08:00:00.000 2005-03-11 09:00:00.000 NULL
5 XJ005 李四 2005-03-11 12:00:00.000 2005-03-11 14:00:00.000 2005-03-11 12:35:00.000
6 XJ006 李四 2005-03-11 12:00:00.000 2005-03-11 14:00:00.000 2005-03-11 13:40:00.000
7 XJ007 李四 2005-03-11 12:00:00.000 2005-03-11 14:00:00.000 NULL
8 XJ008 李四 2005-03-11 12:00:00.000 2005-03-11 14:00:00.000 2005-03-11 14:05:00.000
*/
paoluo 2005-04-21
  • 打赏
  • 举报
回复
楼主,试试


Select
Right(A.SpotNO,1),
A.SpotNO,
A.EmpName,
A.Stime,
A.ETime,
B.PTme
from 表1 A
Left Join
(Select * from 表2 T Where Not Exists (Select * from 表2 Where spotNo=T.spotNo And ID<T.ID)) B
On A.spotNo=B.spotNo

27,579

社区成员

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

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