颇有挑战性的 SQL 语句请教。。。。。。。。。。。(200分)

  • 主题发起人 主题发起人 Jason Law
  • 开始时间 开始时间
J

Jason Law

Unregistered / Unconfirmed
GUEST, unregistred user!
原表:
序号 姓名 日期 时间
1 张三 2006-4-1 10:00:00
1 张三 2006-4-1 12:00:00
1 张三 2006-4-1 13:00:00
1 张三 2006-4-1 14:00:00
1 张三 2006-4-2 10:00:00
1 张三 2006-4-2 12:00:00
1 张三 2006-4-2 13:00:00
1 张三 2006-4-2 14:00:00
2 李四 2006-4-1 11:01:00
2 李四 2006-4-1 15:01:00
2 李四 2006-4-1 16:01:00
2 李四 2006-4-1 17:01:00
2 李四 2006-4-2 10:00:00
2 李四 2006-4-2 12:00:00
2 李四 2006-4-2 13:00:00
2 李四 2006-4-2 14:00:00

通过一条SQL语句变成:

序号 姓名 日期 时间1 时间2 时间3 时间4
1 张三 2006-4-1 10:00:00 12:00:00 13:00:00 14:00:00
1 张三 2006-4-2 11:00:00 15:00:00 16:00:00 17:00:00
1 李四 2006-4-1 10:01:00 12:01:00 13:01:00 14:01:00
1 李四 2006-4-2 10:00:00 12:00:00 13:00:00 14:00:00
 
似乎不行...用临时表吧!
 
在ACCESS中可以用交叉表实现,在MSSQL中好像不行
 
只不过是考勤中的原始刷卡数据、按每天四次卡排列。
用存储过程容易实现
 
哦!

说了这么多,可我还是不会。
 
用游标试试
 
查查交叉表就行了,
我还以为真是什么了不起的[:)]
 
游标(sql),交叉表(access)
 
增加一个刷卡次数的字段,

SELECT 姓名,日期,
(CASE 次数 WHEN 1 THEN 时间 ELSE 0 END) AS 时间1,
(CASE 次数 WHEN 2 THEN 时间 ELSE 0 END) AS 时间2,
(CASE 次数 WHEN 3 THEN 时间 ELSE 0 END) AS 时间3,
(CASE 次数 WHEN 4 THEN 时间 ELSE 0 END) AS 时间4
FROM 表1
GROUP BY 姓名,日期
 
楼上是正解···
 
SELECT 姓名,日期,
(CASE 序号 WHEN 1 THEN 时间 ELSE 0 END) AS 时间1,
(CASE 序号 WHEN 2 THEN 时间 ELSE 0 END) AS 时间2,
(CASE 序号 WHEN 3 THEN 时间 ELSE 0 END) AS 时间3,
(CASE 序号 WHEN 4 THEN 时间 ELSE 0 END) AS 时间4
FROM 表1
GROUP BY 姓名,日期
 
如果姓名今天不小心多刷了一次,那怎么办?[:D]
 
所以,还想有一个可以 判断时间的方法在里面。
 
写个存储过程撒
 
先建立一张刷卡的时间版次表,
create table t_class_time(name varchar,bgtime varchar(20),edtime varchar(20))
依次插入几个班次的开始时间结束时间,这里面的班次name就是对应你的时间1,时间2..
然后动态生成查询,放在一个存储过程里面统计
假定你的基础数据表为t_base,字段为id int,name varchar(50),regdate varchar(20),regtime varchar(20),在sqlserver里面日期的比较可以之间用字符串,但是格式必须规范。
create procedure p_tt
as
declare @s varchar(50)
select @s='select id,name,regdate'
select @s=@s+',max(case when regtime between )'+bgtime+' and '+edtime +' then regtime else null end as '+name from t_class_time
select @s=@s+' from t_base group by id,name,regdate'
exec(@s)

这样就可以根据时间判断并且动态的生成。

思路大致如此。
 
建议还是用存储过程来处理...
 
存储过程来处理...,刷卡的话有时间段的,处理好时间段间的问题(一个时间段有多次也算一次,超过的又该怎么处理。。)
hityou,说得很明白
 
你的豎式卡..應該有序號...Insert 資料庫時 序號以每人每天作單位 排..
先求出當天最大序號..然後前端跑回圈..用Left Join 接成一條SQL...
我試過1萬個員工..每人40張卡..9秒就把資料轉完下到前端
這樣的功能我們叫做豎轉橫..不但刷卡會碰到..考勤檔是豎開也會碰到
如:
序号 姓名 日期 时间
1 张三 2006-4-1 10:00:00
2 张三 2006-4-1 12:00:00
3 张三 2006-4-1 13:00:00
4 张三 2006-4-1 14:00:00
5 张三 2006-4-2 10:00:00
6 张三 2006-4-2 12:00:00
1 李四 2006-4-1 17:01:00
2 李四 2006-4-2 10:00:00
3 李四 2006-4-2 12:00:00
4 李四 2006-4-2 13:00:00
5 李四 2006-4-2 14:00:00
 
你那个序号表示什么哦
 

Similar threads

后退
顶部