菜鸟求助贴,也许你不经意的点开就能帮我一个大忙...

THe5THelement 2011-04-01 12:00:26
描述一下问题:
有三张表:A、B、C
A为任务计分表,用户每完成一个任务,会往此表添加任务得分。相关字段:score、time、userid
B为考核问卷得分表,每人每月有多份此问卷需要填写。相关字段:score、time、userid
C为月度汇总表,相关字段:taskscore、abilityscore、time、userid

需求:
每个月的最后一天,统计每个用户当月任务平均分、问卷平均分,插入C表

被这个问题困扰一上午了,数据库实在是太菜,还望前辈指点一番!先谢过了
...全文
121 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
THe5THelement 2011-04-02
  • 打赏
  • 举报
回复
本人将需求重新描述了一下,很感谢7楼的朋友。另外,的确是本人表达能力有限,并非您理解能力不足。
THe5THelement 2011-04-02
  • 打赏
  • 举报
回复

--用户表
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=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'

-- 汇总表
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字段平均值
*/
THe5THelement 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 acmain_chm 的回复:]

(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语……
[/Quote]
感谢你的回复,正在整理中...
THe5THelement 2011-04-02
  • 打赏
  • 举报
回复
很感谢各位朋友的帮助,WWWWA提供的语句十分正确,特别感谢!
另外要感谢一下7楼的ACMAIN_CHM,如果不是你的提醒,估计没人能看懂我的需求。
很少接触数据库方面的知识,以后需要多多学习。
结贴!
THe5THelement 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwa 的回复:]

楼主要测试 一下 你的代码
SQL code
CREATE TABLE `user` (
`userid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
`departmentid` INT(11) DEFAULT NULL COMMENT '部门ID'
) ENGINE=MYISAM DEFAULT C……
[/Quote]
不好意思,上午没有环境,直接在回复框里写的
WWWWA 2011-04-02
  • 打赏
  • 举报
回复
楼主要测试 一下 你的代码
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) c

ON a.userid=c.userid

WHERE a.`departmentid` IN (2,4)
ACMAIN_CHM 2011-04-01
  • 打赏
  • 举报
回复
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
ACMAIN_CHM 2011-04-01
  • 打赏
  • 举报
回复
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式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)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

THe5THelement 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwwa 的回复:]

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 ……
[/Quote]
inner join筛选掉了两个表中没有出现的user,如何能够不筛选呢?比如没有记录的用户,查出来结果就是空?
希望您不要嫌烦 :P
WWWWA 2011-04-01
  • 打赏
  • 举报
回复
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
WWWWA 2011-04-01
  • 打赏
  • 举报
回复
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
THe5THelement 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwwb 的回复:]

贴建表及插入记录的SQL,及要求结果出来看看
[/Quote]
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
wwwwb 2011-04-01
  • 打赏
  • 举报
回复
贴建表及插入记录的SQL,及要求结果出来看看

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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