sql的一句语句,求教!!(100分)

  • 主题发起人 主题发起人 free_366
  • 开始时间 开始时间
来自:free_366, 时间:2006-6-19 16:22:34, ID:3475262
来自:狼崖山, 时间:2006-6-19 9:19:27, ID:3474729
这个表设计逻辑上本身就有问题~~

愿听其详,谢谢!按部门,某年,某月统计某一个员工某年某月加白班的天数,加夜班的天数,这是目的,我数据库的表是这样设计的,员工ID(唯一),部门,年,月,姓名,考勤1,考勤2....考勤31,记录日期,请指正!



刚看到lz的更详细的要求,晕死,要...考勤31,我上面给的句子才abc才3个,要写到31个有的搞了,应该超长了,不知道能不能走....



记得给分!!!
 
是啊,楼主的表结构要用30个union,还是把表改下吧
 
(4)eloveme :select sum(a) from
(select id,a from table group by having id =77)我运行报错,having 附近有语法错误??
(5)qiuyan0519我要显不的不是这种效果;
(6)jenhon 呵呵,我只负责保证我电脑计算没错,应该不是找我拿吧!!
各位帮看一下,表的设计合理,员工录入数据又方便点呀,我原初设计是某一个员工某一年某一个月,那个有多少天,只录入一次数据,因为这样方便直观,还有的是,有的部门员工考勤月底才录,这样方便点,一次性录入。
我设计的思路是这样:员工ID,员工姓名,1号:加白,2号:加白,3号:加中,4号:加夜,5号:出差......31号:婚假,只是一条录入数据,可一天的录,第二天,直接在第一天生成的记录在添加行了,也可一次性录入,谢谢,解决好这个,完成项目一半呀
 
楼主的表结构还是可以考虑一下。对于员工录入数据,这种存储的结构的灵活性差,并且冗余字段多。对于楼主所希望的“一次性录入”来说,更新一条记录和去新增加一条记录的负荷差不多,但在统计面前,“员工ID(唯一),部门,年,月,日 姓名,考勤 记录日期 ”这种结构在灵活性和效率上可就大大高于一条记录的结构了。同时,一条记录的表结构中还要考虑每个月的天数,不是很麻烦?
 
刚看到lz的更详细的要求,晕死,要...考勤31,我上面给的句子才abc才3个,要写到31个有的搞了,应该超长了,不知道能不能走....是呀,服务器可能受不了
 
可惜不是写delphi程序,写程序就方便了;
 
自:weichao9999, 时间:2006-6-19 17:01:33, ID:3475317
员工ID,部门, 日期, 班次,考勤,记录日期
77 人力资源部 2006-01-04 1 加白 2006-06-18
77 人力资源部 2006-01-04 2 加白 2006-06-18
77 人力资源部 2006-01-04 3 加夜 2006-06-18
77 人力资源部 2006-01-05 1 矿工 2006-06-19
77 人力资源部 2006-01-05 2 事假 2006-06-19
77 人力资源部 2006-01-05 3 加夜 2006-06-19
这个思想和我的较接近,但如果我要自动统计考勤表某一个部门某一个员工某月的加白,加夜天数等,然后与另一个项目表的数据合成,数据时时插入到工资表,生成工资单,如何插入?按日期,但写程序又如何判断?日期>=2006-01-01 and 日期<=2006-01-31,这样我写程序不是每个月都要判断?
 
如果按照我上面说的union的思路,那就能迎合的你要求了,你写31个union对系统来说是个小case。
我说不知道能不能走意思是说:
标准的sql语句一个句子长度不能超过255个字节;实际上,超过了也能走的,就是需要赋值到一个字符变量里面去,再去运行,问题是不知道上限是多少,怕还是超过了。

另外这个语句的建立你可以使用for do来做的,不要用Parameters了,参数(比如日期)直接就写在语句中,没什么难度的。
ps:每个月都是31列,这个思路没错。
 
你就用union吧,我昨天还写了一个24个union的语句,也不是很麻烦,字符怎么也不过超过4000的,放在存储过程里面,执行还是挺快的.
 
这么多人做考勤系统啊
 
哦``不好意思``昨天顺手就写的``今天给你纠正``

看一个事例..

select sum(a) from
(select id,a from table1 group by id,a having id ='77') DERIVEDTBL
觉得通过``

然后你可以试着改条件``直到符合你的要求``
 
hityou,可以发语句给我呀,Q237189068,E-mail:free_169@163.com,谢谢
eloveme,谢谢,我再测一下
 
楼主的表结构还是可以考虑一下。对于员工录入数据,这种存储的结构的灵活性差,并且冗余字段多。对于楼主所希望的“一次性录入”来说,更新一条记录和去新增加一条记录的负荷差不多,但在统计面前,“员工ID(唯一),部门,年,月,日 姓名,考勤 记录日期 ”这种结构在灵活性和效率上可就大大高于一条记录的结构了。同时,一条记录的表结构中还要考虑每个月的天数,不是很麻烦?
说得有道理,每个月的天数,我全设为31天,有的就填,没有就留空,这个不打算判断每月的天数.
 
select a+b+c from (SELECT a = CASE a WHEN '加白' THEN 1 ELSE 0 end,
b = CASE b WHEN '加白' THEN 1 ELSE 0 end, c = CASE c WHEN '加白' THEN 1 ELSE 0 end
FROM Table4) c
这个满足搂主的需要,如果求加黑,那么把里面的字符换成加黑即可

另:表结构并不是就要原样给用户显示的,可以修改的。
 
楼上,看后面跟贴,不只abc啊,要31个呢。还有id呢?不是每个id都算一次吧?

我写一个试试:(字段:A1~A31)
var sql:string;
sdate,edate:tDateTime;
....
sdate:=strtodate('2006-01-01');edate:=strtodate('2006-01-31')
sql:='select id,sum(a) as 加白班次数 from (';
for i:=1 to 31 do
begin
sql:=sql+'select id,count(id)as a from table where A'+IntToStr(i)+'=''加白'''
sql:=sql+'and (日期>='''+DateToStr(sdate)+''')and(日期<='''+DateToStr(edate)+''') group by id ';
if i<31 then sql:=sql+' union '; //最后一个不要再union了
end;
sql:=sql+')group by id ';


没有调试,有什么问题说说。
 
不是每个id都算一次吧?是呀,每个员工的ID都每天算一次,再加员工的固定项目表一起插入到员工工资表,实时算起员工当天的工资
 
sum(a),我的a是字符型呀,这样写会报错
 
陈晨,这语句运行没问题,但是存在一个就是a变量的值现有:加白,加夜等,但是我做的后台有可能增加一个“产假”,也有可能“加白”不要了,那些语句又要重写?还有就是语句长了点,还有较简洁的吗?谢谢!
 
select id,sum(a) as 加白班次数 from
(select id,count(id)as a from table where a='加白' and (日期段) group by id
union
select id,count(id)as a from table where b='加白' and (日期段) group by id
union
select id,count(id)as a from table where c='加白' and (日期段) group by id
)
group by id
我运行提示group附近有语法错误,看不出来?
 
陈晨
select Mark1+Mark2+Mark3+Mark4+Mark5+Mark6+Mark7+Mark8+Mark9+Mark10+Mark11+Mark12+Mark13+Mark14+Mark15+
Mark16+Mark17+Mark18+Mark19+Mark20+Mark21+Mark22+Mark23+Mark24+Mark25+Mark26+Mark27+Mark28+Mark28+Mark30+Mark31
from (SELECT Mark1= CASE Mark1 WHEN '加白' THEN 1 ELSE 0 end,
Mark2 = CASE Mark2 WHEN '加白' THEN 1 ELSE 0 end,
Mark3 = CASE Mark3 WHEN '加白' THEN 1 ELSE 0 end,
Mark4 = CASE Mark4 WHEN '加白' THEN 1 ELSE 0 end,
Mark5 = CASE Mark5 WHEN '加白' THEN 1 ELSE 0 end,
Mark6 = CASE Mark6 WHEN '加白' THEN 1 ELSE 0 end,
Mark7 = CASE Mark7 WHEN '加白' THEN 1 ELSE 0 end,
Mark8 = CASE Mark8 WHEN '加白' THEN 1 ELSE 0 end,
Mark9 = CASE Mark9 WHEN '加白' THEN 1 ELSE 0 end,
Mark10 = CASE Mark10 WHEN '加白' THEN 1 ELSE 0 end,
Mark11 = CASE Mark11 WHEN '加白' THEN 1 ELSE 0 end,
Mark12 = CASE Mark12 WHEN '加白' THEN 1 ELSE 0 end,
Mark13 = CASE Mark13 WHEN '加白' THEN 1 ELSE 0 end,
Mark14 = CASE Mark14 WHEN '加白' THEN 1 ELSE 0 end,
Mark15 = CASE Mark15 WHEN '加白' THEN 1 ELSE 0 end,
Mark16 = CASE Mark16 WHEN '加白' THEN 1 ELSE 0 end,
Mark17 = CASE Mark17 WHEN '加白' THEN 1 ELSE 0 end,
Mark18 = CASE Mark18 WHEN '加白' THEN 1 ELSE 0 end,
Mark19 = CASE Mark19 WHEN '加白' THEN 1 ELSE 0 end,
Mark20 = CASE Mark20 WHEN '加白' THEN 1 ELSE 0 end,
Mark21 = CASE Mark21 WHEN '加白' THEN 1 ELSE 0 end,
Mark22 = CASE Mark22 WHEN '加白' THEN 1 ELSE 0 end,
Mark23 = CASE Mark23 WHEN '加白' THEN 1 ELSE 0 end,
Mark24 = CASE Mark24 WHEN '加白' THEN 1 ELSE 0 end,
Mark25 = CASE Mark25 WHEN '加白' THEN 1 ELSE 0 end,
Mark26 = CASE Mark26 WHEN '加白' THEN 1 ELSE 0 end,
Mark27 = CASE Mark27 WHEN '加白' THEN 1 ELSE 0 end,
Mark28 = CASE Mark28 WHEN '加白' THEN 1 ELSE 0 end,
Mark29 = CASE Mark29 WHEN '加白' THEN 1 ELSE 0 end,
Mark30 = CASE Mark30 WHEN '加白' THEN 1 ELSE 0 end,
Mark31= CASE Mark31 WHEN '加白' THEN 1 ELSE 0 end
FROM Work_Work where Years=2006 and Months=1 and PersonnelID=78)
Mark31
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部