刚刚看到一位朋友法的帖子,我也遇到类似的问题,但我的跟他有点不大相同
我的3个表如下:
表a:
考勤时间   工作天数
2006-4     24
.......     .......
.......     .......表b:
职工编号   职工姓名    所在部门  事假   病假    其它假   总假
100000     张三        人事部     5      0       0        5
100001     李四        人事部     0      2       0        2
......     ........    .......    ..     ..      ..       ..
......     ........    .......    ..     ..      ..       ..表c:
考勤时间   所在部门  应出勤人数  应出勤天数 实出勤天数 事假统计 病假统计 其它假  缺勤合计
2006-4     人事部       ..          ..          ..        5        2      0         7如何把表a和表b的部分数据汇总到第三个表c呢,我是按部门进行统计的
职工人数=该部门所有员工合计
应出勤天数=职工人数*工作天数
实出勤天数=应出勤天数-缺勤合计
缺勤合计=该部门所有职工的总假合计我只能统计出表C中部分数据在datagrid上显示(不知用这个控件显示数据是不是合理的?),如"事假统计","病假统计",....等等,但是"应出勤人数  应出勤天数  实出勤天数"不知如何通过代码统计,请大家指点一下~

解决方案 »

  1.   

    可能是表显示不清楚,大家看花眼了吧,呵呵^_^
     表a:
    考勤时间   工作天数
    2006-4     24
    .......     .......
    .......     .......表b:
    职工编号   职工姓名    所在部门  事假   病假    其它假   总假
    100000     张三        人事部     5      0       0        5
    100001     李四        人事部     0      2       0        2
    ......     ........    .......    ..     ..      ..       ..
    ......     ........    .......    ..     ..      ..       ..表c:
    考勤时间   所在部门  应出勤人数  应出勤天数  实出勤天数  事假统计   病假统计  其它假统计   缺勤合计
    2006-4     人事部       ..          ..          ..           5           2           0          7   高手来帮忙看看呵
      

  2.   

    select 考勤时间, 所在部门, count(职工编号) as 应出勤人数, (count(职工编号) * 工作天数) as 应出勤天数, ... from 表a, 表b group by 考勤时间, 所在部门 order by 考勤时间省略的部分是你已经会的。
      

  3.   

    楼上,感谢你
    还是不行,你写的SQL语句还没将表a中的"工作天数"读出来....我详细跟你说一下我遇到的情况吧
    表a是工作日登记表
    表b是职工考勤表,里面存放职工的基本缺勤信息
    表c是部门考勤表,对职工的缺勤信息进行汇总统计
    表b的考勤时间依赖于表a,而表c的考勤时间又依赖是表b(不好意思,表b的属性也有"考勤时间",写漏了^_^)我进行月度统计的时候,设置了两个combo控件,combo1用于选择"考勤时间",combo2用于选择"所在部门",只有当这个完全匹配的时候,才开始进行统计.......那代码应该怎么改?我试过好多方法,都不对,请你继续指点......在线等待
      

  4.   

    SELECT 表a.考勤时间, tmp.所在部门, tmp.应出勤人数,
     (tmp.应出勤人数 * 表a.工作天数) as 应出勤天数,
     (tmp.应出勤人数 * 表a.工作天数 - tmp.事假统计 - tmp.病假统计 - tmp.其它假统计) as 实出勤天数,
     tmp.事假统计, tmp.病假统计, tmp.其它假统计 
    FROM 表a,
     (select 所在部门, count(所在部门) as 应出勤人数, sum(事假) as 事假统计, sum(病假) group by 考勤时间, 所在部门) 职工编号
      

  5.   

    没写完,就误发了。更正:SELECT 表a.考勤时间, tmp.所在部门, tmp.应出勤人数,
     (tmp.应出勤人数 * 表a.工作天数) as 应出勤天数,
     (tmp.应出勤人数 * 表a.工作天数 - tmp.事假统计 - tmp.病假统计 - tmp.其它假统计) as 实出勤天数,
     tmp.事假统计, tmp.病假统计, tmp.其它假统计 
    FROM 表a,
     (SELECT 所在部门, count(所在部门) as 应出勤人数, sum(事假) as 事假统计, sum(病假) as 病假统计, sum(其它假) as 其它假统计 FROM 表b GROUP BY 所在部门 HAVING 所在部门='人事部') AS tmp
      

  6.   

    运行时,提示"列前缀'表a(我已经转为我自己建的表名了)'与查询中所用的名或别名不匹配"
       其实我是想把表a,和表b中的数据先统计一下,然后在DATAGRID上显示,其实表c在统计之前是没任何数据的
       另外在"所在部门 HAVING 所在部门='人事部'<----这里可以改为"所在部门='" & Trim(Combo2.Text) & "'"吗?
      

  7.   

    因为没有重复的字段名,可以把字段前缀都去掉。仅仅是为了你能看明白。可以:
    ...HAVING 所在部门='" & Combo2.Text & "'"
      

  8.   

    呵呵,知道了^_^
       还有个问题要问你:其实我的表c中没有任何数据的啊,比如"考勤时间"和"所在部门"所有数据都是通过查询统计表b和表a获得,那我在执行你写的语句是空值,那该怎么改才好呢?
       等待中.......
      

  9.   

    呵呵,知道了^_^
       还有个问题要问你:其实我的表c中没有任何数据的啊,比如"考勤时间"和"所在部门"所有数据都是通过查询统计表b和表a获得,那我在执行你写的语句是空值,那该怎么改才好呢?
       等待中.......
    -------------------------------------------
    表C的内容来自对表B和表A的查询统计。
    (1)什么时候对表C进行写入操作,每次查询统计时都写入吗?
    (2)“那我在执行你写的语句是空值,…”不明白什么意思?insert into 表C
    上面的查询统计语句
      

  10.   

    可能是我的表达不好,令楼上误解了,我解析一下吧
        回答(1)先统计显示,单击“保存”后将统计数据保存在表c,其实表c是空的(我刚刚建好的,还没统计数据);是的,每次查询都写入的,因为每月都要统计一次,统计时不会覆盖原来数据
        回答(2)这是我回答of123的,因为表c刚开始没数据,只有字段名字,所以执行他写的语句是空值
        
        在VB执行“insert into 表C”可以吗?我不太明白,还望你告知
      

  11.   

    楼主的意思是说,查询统计后,单击“保存”就会将本次查询统计的结果写入表C,如果不保存就不写入了是吗?VB中当然可以执行“insert into 表C select A, B, … from …”这样的语句,这只取决于数据库是否支持,跟编程语言无关呀。如果我理解的没错,就分两个模块:
    (1)查询统计:使用of123() 的方法即可,然后显示统计结果;
    (2)保存结果:可以用insert into 表C + 查询结果的方法,但是,这样相当于又查询了一次,不太好!!可以用一个循环(如果有多条记录的话,否则更简单了),将前面已经得到的查询统计结果记录集的内容一条一条的写入到表C中去。
      

  12.   

    首先感谢楼上的意见,你的理解跟我的做法是一致的^_^
       如果想(2)那样要再查询一次,那好麻烦啊,有没有更简单的方法?
       我想到另一个方法:用MSFLEXGRID控件显示查询(表a和表b)的内容,当我统计时,我把统计结果用多个TEXT文本框显示统计的结果,然后把这些结果保存表c中,这样是不是更简单点?
       请继续给建议~
      

  13.   

    在(2)已经告诉你一个方法了呀,呵呵!
    通过(1)的执行,你一定已经得到了一个记录集,这就是本次查询统计的结果,没错吧!
    不防假设记录集的名字为rs_Result
    那么,保存时应当这样:
    rs_Result.MoveFirst
    While Not rs_Result.Eof
        表3.AddNew
        表3!字段1 = rs_Result!对应字段
        表3!字段2 = rs_Result!对应字段
        ...
        表3!字段n = rs_Result!对应字段
        表3.Update    rs_Result.MoveNext
    Wend
    这样的话,不存在两次查询的问题呀。提示:如果表3的结构同查询结果集字段结构次序一样,可以考虑用一个循环设置字段的对应关系。像下面这样:
    rs_Result.MoveFirst
    While Not rs_Result.Eof
        表3.AddNew
        For i = 0 to 表3.Fields.Count - 1
            表3.Fields(i).Value = rs_Result.Fields(i).Value
        Next i
        其它字段的对应…
        表3.Update    rs_Result.MoveNext
    Wend
      

  14.   

    呵呵,我试试看咯
       执行(1)有问题:提示"列前缀'表a(我已经转为我自己建的表名了)'与查询中所用的名或别名不匹配",这个关还是过不了,我想还是表c中没数据造成的,of123写的语句太长了,我看得太晕了,你能帮我解释解释吗?(我对SQL有点感冒)
     
      

  15.   

    你的SQL虽然长,但其实是简单的,基本就是联合查询。
    我不会帮你写,应该好好学习一下Transact SQL的语法,学会自己分析。