本帖最后由 THe5THelement 于 2011-04-01 12:04:03 编辑

解决方案 »

  1.   

    insert into C (taskscore,abilityscore,time,userid)
    select taskscore,abilityscore,'2010-03-01',t1.userid
    from(select avg(score) as taskscore,userid from A where time between '2010-03-01' and  '2010-03-31 23:59:59' group by userid) t1,
    (select avg(score) as abilityscore,userid from B where time between '2010-03-01' and  '2010-03-31 23:59:59' group by userid) t2
    where t1.userid=t2.userid
      

  2.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  3.   

    ok,我列出相关字段并说明一下期望的结果
    任务得分表:points
    userid    score    operatetime
    1              8         2010-12-10
    1              10       2010-12-20
    2              8         2010-12-9
    调查问卷表:questionnaire
    target    score    status  q_time
    1               20          1      2010-12
    1               0            0      2010-12
    1                18         1      2010-12
    2                0           0      2010-12
    考核成绩表:performance,其中taskscore字段为points中的score取平均值,abilityscore字段为questionnaire中status字段为1的score取平均值,若没有则为0.下面就是我想要的效果
    userid      taskscore    abilityscore    p_time
    1                     9                   19           2010-12
    2                     8                    0            2010-12
      

  4.   

    select * from (
    select userid,avg(score) from points group by userid) a
    inner join
    (select target,avg(score),max(q_time) from questionnaire where status=1 group by target) b
    on a.userid=b.target
      

  5.   

    select userid,taskscore,abilityscore,p_time from (
    select userid,avg(score) as taskscore from points group by userid) a
    inner join
    (select target,avg(score) as abilityscore,max(q_time) as  p_time from questionnaire where status=1 group by target) b
    on a.userid=b.target
      

  6.   

    inner join筛选掉了两个表中没有出现的user,如何能够不筛选呢?比如没有记录的用户,查出来结果就是空?
    希望您不要嫌烦 :P
      

  7.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  8.   


    --用户表
    CREATE TABLE `user` (
       `userid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
       `departmentid` INT(11) DEFAULT NULL COMMENT '部门ID',
     ) ENGINE=MYISAM DEFAULT CHARSET=utf8
    INSERT INTO USER SELECT 1,1
    INSERT INTO USER SELECT 2,2
    INSERT INTO USER SELECT 3,2
    INSERT INTO USER SELECT 4,4
    INSERT INTO USER SELECT 5,5-- 任务得分表
    CREATE TABLE `points` (
       `USERID` INT(11) NOT NULL COMMENT '人员',
       `SCORE` DOUBLE NOT NULL COMMENT '分数',
       `operatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     ) ENGINE=MYISAM DEFAULT CHARSET=utf8
    INSERT INTO points SELECT 1,10,'2010-12-01'
    INSERT INTO points SELECT 2,8,'2010-11-01'
    INSERT INTO points SELECT 2,8,'2010-12-01'
    INSERT INTO points SELECT 2,10,'2010-12-01'
    INSERT INTO points SELECT 5,10,'2010-12-01'
    INSERT INTO points SELECT 3,10,'2010-11-02'
    INSERT INTO points SELECT 4,10,'2010-12-02'-- 调查问卷成绩表
    CREATE TABLE `questionnaire_form` (
       `userid` INT(11) NOT NULL,
       `status` INT(11) NOT NULL DEFAULT '0',
       `score` DOUBLE NOT NULL DEFAULT '0',
       `performancemonth` VARCHAR(10) DEFAULT NULL,
     ) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO questionnaire_form SELECT 2,1,18,'2010-11'
    INSERT INTO questionnaire_form SELECT 2,1,20,'2010-12'
    INSERT INTO questionnaire_form SELECT 2,1,18,'2010-12'
    INSERT INTO questionnaire_form SELECT 3,1,20,'2010-12'
    INSERT INTO questionnaire_form SELECT 2,0,0,'2010-12'
    INSERT INTO questionnaire_form SELECT 4,0,0,'2010-12'
    INSERT INTO questionnaire_form SELECT 4,0,0,'2010-12'-- 汇总表
    CREATE TABLE `performances` (
       `performancemonth` VARCHAR(10) NOT NULL,
       `userid` INT(11) NOT NULL,
       `taskscore` DOUBLE NOT NULL,
       `abilityscore` DOUBLE NOT NULL
     ) ENGINE=INNODB DEFAULT CHARSET=utf8-- 要将这样的报表插入上表中
    /*
    performancemonth  userid  taskscore  abilityscore
    2010-12           2       9          19
    2010-12           3       0          20
    2010-12           4       10         0描述:
    1、只统计user表中departmentid为2、4的用户
    2、只统计2010-12月数据
    3、只统计abilityscore表中status字段为1的数据
    3、taskscore为points表score字段平均值
    4、abilityscore为questionnaire_form表score字段平均值
    */
      

  9.   

    楼主要测试 一下 你的代码
    CREATE TABLE `user` (
       `userid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
       `departmentid` INT(11) DEFAULT NULL COMMENT '部门ID'
     ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
     
    INSERT INTO `USER` SELECT 1,1;
    INSERT INTO `USER` SELECT 2,2;
    INSERT INTO `USER` SELECT 3,2;
    INSERT INTO `USER` SELECT 4,4;
    INSERT INTO `USER` SELECT 5,5;CREATE TABLE `points` (
       `USERID` INT(11) NOT NULL COMMENT '人员',
       `SCORE` DOUBLE NOT NULL COMMENT '分数',
       `operatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
     ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
    INSERT INTO points SELECT 1,10,'2010-12-01';
    INSERT INTO points SELECT 2,8,'2010-11-01';
    INSERT INTO points SELECT 2,8,'2010-12-01';
    INSERT INTO points SELECT 2,10,'2010-12-01';
    INSERT INTO points SELECT 5,10,'2010-12-01';
    INSERT INTO points SELECT 3,10,'2010-11-02';
    INSERT INTO points SELECT 4,10,'2010-12-02';CREATE TABLE `questionnaire_form` (
       `userid` INT(11) NOT NULL,
       `status` INT(11) NOT NULL DEFAULT '0',
       `score` DOUBLE NOT NULL DEFAULT '0',
       `performancemonth` VARCHAR(10) DEFAULT NULL
     ) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO questionnaire_form SELECT 2,1,18,'2010-11';
    INSERT INTO questionnaire_form SELECT 2,1,20,'2010-12';
    INSERT INTO questionnaire_form SELECT 2,1,18,'2010-12';
    INSERT INTO questionnaire_form SELECT 3,1,20,'2010-12';
    INSERT INTO questionnaire_form SELECT 2,0,0,'2010-12';
    INSERT INTO questionnaire_form SELECT 4,0,0,'2010-12';
    INSERT INTO questionnaire_form SELECT 4,0,0,'2010-12';SELECT p_time AS performancemonth, a.*,IFNULL(b.abilityscore,0),IFNULL(c.taskscore,0) FROM `user` a 
    LEFT JOIN
    (SELECT userid,AVG(score) AS abilityscore,MAX(performancemonth) AS p_time FROM questionnaire_form WHERE STATUS=1 AND performancemonth='2010-12' GROUP BY userid) b
    ON a.userid=b.userid
    LEFT JOIN
    (SELECT userid,AVG(score) AS taskscore FROM points WHERE DATE(`operatetime`) BETWEEN '2010-12-01' AND '2010-12-31' GROUP BY userid) cON a.userid=c.useridWHERE a.`departmentid` IN (2,4)
      

  10.   

    很感谢各位朋友的帮助,WWWWA提供的语句十分正确,特别感谢!
    另外要感谢一下7楼的ACMAIN_CHM,如果不是你的提醒,估计没人能看懂我的需求。
    很少接触数据库方面的知识,以后需要多多学习。
    结贴!