问题描述:
--用户表
create table baseuser
(
usercode varchar(50) primary key ,
fullname varchar(100) not null
);--项目表
create table projects
(
id int primary key auto_increment,
projectname varchar(100) unique key not null
);--周工作表
create table weekly
(
id int primary key auto_increment,
usercode varchar(50),commitdate datetime,--提交日期PROJECT VARCHAR(100) DEFAULT ""; --对应项目表中的projectname,十个字段表示一周最多参与十个项目
PROJECT2 VARCHAR(100) DEFAULT "";
PROJECT4 VARCHAR(100) DEFAULT "";
PROJECT5 VARCHAR(100) DEFAULT "";
PROJECT6 VARCHAR(100) DEFAULT "";
PROJECT7 VARCHAR(100) DEFAULT "";
PROJECT8 VARCHAR(100) DEFAULT "";
PROJECT9 VARCHAR(100) DEFAULT "";
PROJECT10 VARCHAR(100) DEFAULT "";WORKHOURS SMALLINT(6) DEFAULT 0; --工时,和上面项目一一对应
WORKHOURS2 SMALLINT(6) DEFAULT 0;
WORKHOURS3 SMALLINT(6) DEFAULT 0;
WORKHOURS4 SMALLINT(6) DEFAULT 0;
WORKHOURS5 SMALLINT(6) DEFAULT 0;
WORKHOURS6 SMALLINT(6) DEFAULT 0;
WORKHOURS7 SMALLINT(6) DEFAULT 0;
WORKHOURS8 SMALLINT(6) DEFAULT 0;
WORKHOURS9 SMALLINT(6) DEFAULT 0;
WORKHOURS10 SMALLINT(6) DEFAULT 0;
);
在某个时间段(提交日期)内,按项目,人员统计工时。
项目名称 和 员工姓名都是从表里面取得的
统计要求:
项目 员工姓名1 员工姓名2 员工姓名3 合计
项目1 15 12 0 55
项目2 15 12 0 66
项目3 15 12 0 77
项目4 15 12 0 88
项目5 15 12 0 99 请高手门指点下拉拉拉
--用户表
create table baseuser
(
usercode varchar(50) primary key ,
fullname varchar(100) not null
);--项目表
create table projects
(
id int primary key auto_increment,
projectname varchar(100) unique key not null
);--周工作表
create table weekly
(
id int primary key auto_increment,
usercode varchar(50),commitdate datetime,--提交日期PROJECT VARCHAR(100) DEFAULT ""; --对应项目表中的projectname,十个字段表示一周最多参与十个项目
PROJECT2 VARCHAR(100) DEFAULT "";
PROJECT4 VARCHAR(100) DEFAULT "";
PROJECT5 VARCHAR(100) DEFAULT "";
PROJECT6 VARCHAR(100) DEFAULT "";
PROJECT7 VARCHAR(100) DEFAULT "";
PROJECT8 VARCHAR(100) DEFAULT "";
PROJECT9 VARCHAR(100) DEFAULT "";
PROJECT10 VARCHAR(100) DEFAULT "";WORKHOURS SMALLINT(6) DEFAULT 0; --工时,和上面项目一一对应
WORKHOURS2 SMALLINT(6) DEFAULT 0;
WORKHOURS3 SMALLINT(6) DEFAULT 0;
WORKHOURS4 SMALLINT(6) DEFAULT 0;
WORKHOURS5 SMALLINT(6) DEFAULT 0;
WORKHOURS6 SMALLINT(6) DEFAULT 0;
WORKHOURS7 SMALLINT(6) DEFAULT 0;
WORKHOURS8 SMALLINT(6) DEFAULT 0;
WORKHOURS9 SMALLINT(6) DEFAULT 0;
WORKHOURS10 SMALLINT(6) DEFAULT 0;
);
在某个时间段(提交日期)内,按项目,人员统计工时。
项目名称 和 员工姓名都是从表里面取得的
统计要求:
项目 员工姓名1 员工姓名2 员工姓名3 合计
项目1 15 12 0 55
项目2 15 12 0 66
项目3 15 12 0 77
项目4 15 12 0 88
项目5 15 12 0 99 请高手门指点下拉拉拉
(
id int primary key auto_increment,
usercode varchar(50),commitdate datetime,--提交日期PROJECT VARCHAR(100) DEFAULT ""; --对应项目表中的projectname,十个字段表示一周最多参与十个项目
PROJECT2 VARCHAR(100) DEFAULT "";
PROJECT4 VARCHAR(100) DEFAULT "";
PROJECT5 VARCHAR(100) DEFAULT "";
PROJECT6 VARCHAR(100) DEFAULT "";
PROJECT7 VARCHAR(100) DEFAULT "";
PROJECT8 VARCHAR(100) DEFAULT "";
PROJECT9 VARCHAR(100) DEFAULT "";
PROJECT10 VARCHAR(100) DEFAULT "";WORKHOURS SMALLINT(6) DEFAULT 0; --工时,和上面项目一一对应
WORKHOURS2 SMALLINT(6) DEFAULT 0;
WORKHOURS3 SMALLINT(6) DEFAULT 0;
WORKHOURS4 SMALLINT(6) DEFAULT 0;
WORKHOURS5 SMALLINT(6) DEFAULT 0;
WORKHOURS6 SMALLINT(6) DEFAULT 0;
WORKHOURS7 SMALLINT(6) DEFAULT 0;
WORKHOURS8 SMALLINT(6) DEFAULT 0;
WORKHOURS9 SMALLINT(6) DEFAULT 0;
WORKHOURS10 SMALLINT(6) DEFAULT 0;
);楼主你的这个SQL语句能正确执行吗?
建议你能给出测试数据 (不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
MySQL交叉表
--用户表
create table baseuser
(
usercode varchar(50) primary key ,
fullname varchar(100) not null
);--项目表
create table projects
(
id int primary key auto_increment,
projectname varchar(100) unique key not null
);--周工作表
create table weekly
(
id int primary key auto_increment,
usercode varchar(50),
commitdate datetime,--提交日期PROJECT VARCHAR(100) DEFAULT "", --对应项目表中的projectname,十个字段表示一周最多参与十个项目
PROJECT2 VARCHAR(100) DEFAULT "",
PROJECT3 VARCHAR(100) DEFAULT "",
PROJECT4 VARCHAR(100) DEFAULT "",
PROJECT5 VARCHAR(100) DEFAULT "",
PROJECT6 VARCHAR(100) DEFAULT "",
PROJECT7 VARCHAR(100) DEFAULT "",
PROJECT8 VARCHAR(100) DEFAULT "",
PROJECT9 VARCHAR(100) DEFAULT "",
PROJECT10 VARCHAR(100) DEFAULT "",WORKHOURS SMALLINT(6) DEFAULT 0, --工时,和上面项目一一对应
WORKHOURS2 SMALLINT(6) DEFAULT 0,
WORKHOURS3 SMALLINT(6) DEFAULT 0,
WORKHOURS4 SMALLINT(6) DEFAULT 0,
WORKHOURS5 SMALLINT(6) DEFAULT 0,
WORKHOURS6 SMALLINT(6) DEFAULT 0,
WORKHOURS7 SMALLINT(6) DEFAULT 0,
WORKHOURS8 SMALLINT(6) DEFAULT 0,
WORKHOURS9 SMALLINT(6) DEFAULT 0,
WORKHOURS10 SMALLINT(6) DEFAULT 0
);
insert into baseuser values ('zhangsan','张三');
insert into baseuser values ('lisi','李四');
insert into baseuser values ('wangwu','王五');
insert into projects VALUES(1,'学生信息管理系统');
insert into projects VALUES(2,'图书管理系统');
insert into projects VALUES(3,'超市管理系统');
insert into projects VALUES(4,'仓库管理系统');
insert into projects VALUES(5,'PETSHOP');
insert into projects VALUES(6,'报表系统');
insert into projects VALUES(7,'通勤系统');
insert into projects VALUES(8,'会议室预定');
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,PROJECT3,WORKHOURS,WORKHOURS2,WORKHOURS3) values (1,'zhangsan','2010-03-17 12:00:00','学生信息管理系统','图书管理系统','PETSHOP',20,30,15);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,WORKHOURS,WORKHOURS2) values (2,'lisi','2010-03-17 12:00:00','报表系统','PETSHOP',30,10);
insert into weekly(id,usercode,commitdate,PROJECT,WORKHOURS) values (3,'wangwu','2010-03-17 12:00:00','超市管理系统',50);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,PROJECT3,WORKHOURS,WORKHOURS2,WORKHOURS3) values (4,'zhangsan','2010-03-24 12:00:00','学生信息管理系统','图书管理系统','PETSHOP',20,30,15);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,WORKHOURS,WORKHOURS2) values (5,'lisi','2010-03-24 12:00:00','报表系统','PETSHOP',30,10);
insert into weekly(id,usercode,commitdate,PROJECT,WORKHOURS) values (6,'wangwu','2010-03-24 12:00:00','超市管理系统',50);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,PROJECT3,WORKHOURS,WORKHOURS2,WORKHOURS3) values (7,'zhangsan','2010-03-30 12:00:00','学生信息管理系统','通勤系统','PETSHOP',20,30,15);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,WORKHOURS,WORKHOURS2) values (8,'lisi','2010-03-30 12:00:00','报表系统','PETSHOP',30,10);
insert into weekly(id,usercode,commitdate,PROJECT,WORKHOURS) values (9,'wangwu','2010-03-30 12:00:00','超市管理系统',50);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,PROJECT3,WORKHOURS,WORKHOURS2,WORKHOURS3) values (10,'zhangsan','2010-04-06 12:00:00','图书管理系统','通勤系统','会议室预定',20,30,15);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,WORKHOURS,WORKHOURS2) values (11,'lisi','2010-04-06 12:00:00','仓库管理系统','PETSHOP',30,10);
insert into weekly(id,usercode,commitdate,PROJECT,WORKHOURS) values (12,'wangwu','2010-04-06 12:00:00','仓库管理系统',50);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,PROJECT3,WORKHOURS,WORKHOURS2,WORKHOURS3) values (13,'zhangsan','2010-04-13 12:00:00','图书管理系统','通勤系统','会议室预定',20,30,15);
insert into weekly(id,usercode,commitdate,PROJECT,PROJECT2,WORKHOURS,WORKHOURS2) values (14,'lisi','2010-04-13 12:00:00','仓库管理系统','PETSHOP',30,10);
insert into weekly(id,usercode,commitdate,PROJECT,WORKHOURS) values (15,'wangwu','2010-04-13 12:00:00','仓库管理系统',50);
/*
在某个时间段(提交日期)内,按项目,人员统计工时。
项目名称 和 员工姓名都是从表里面取得的
统计要求:
项目 张三 李四 王五 合计
学生信息管理系统 15 12 0 55
图书管理系统 15 12 0 66
超市管理系统 15 12 0 77
仓库管理系统 15 12 0 88
PETSHOP 15 12 0 99
报表系统 15 12 0 99
通勤系统 15 12 0 99
会议室预定 15 12 0 99
*/国庆放假 工作也放下来了,我这个和交差表有些不同吧 很伤脑筋。
项目 张三
学生信息管理系统 15mysql> select PROJECT,
-> sum(if(usercode='zhangsan',WORKHOURS,0)) as `张三`,
-> sum(if(usercode='lisi',WORKHOURS,0)) as `李四`,
-> sum(if(usercode='wangwu',WORKHOURS,0)) as `王五`,
-> sum(WORKHOURS) as `合计`
-> from (
-> select id,usercode,commitdate,PROJECT,WORKHOURS from weekly where PROJECT !=''
-> union all
-> select id,usercode,commitdate,PROJECT2,WORKHOURS2 from weekly where PROJECT2 !=''
-> union all
-> select id,usercode,commitdate,PROJECT3,WORKHOURS3 from weekly where PROJECT3 !=''
-> union all
-> select id,usercode,commitdate,PROJECT4,WORKHOURS4 from weekly where PROJECT4 !=''
-> union all
-> select id,usercode,commitdate,PROJECT5,WORKHOURS5 from weekly where PROJECT5 !=''
-> union all
-> select id,usercode,commitdate,PROJECT6,WORKHOURS6 from weekly where PROJECT6 !=''
-> union all
-> select id,usercode,commitdate,PROJECT7,WORKHOURS7 from weekly where PROJECT7 !=''
-> union all
-> select id,usercode,commitdate,PROJECT8,WORKHOURS8 from weekly where PROJECT8 !=''
-> union all
-> select id,usercode,commitdate,PROJECT9,WORKHOURS9 from weekly where PROJECT9 !=''
-> union all
-> select id,usercode,commitdate,PROJECT10,WORKHOURS10 from weekly where PROJECT10 !=''
-> ) t
-> group by PROJECT;
+------------------+------+------+------+------+
| PROJECT | 张三 | 李四 | 王五 | 合计 |
+------------------+------+------+------+------+
| 通勤系统 | 90 | 0 | 0 | 90 |
| 图书管理系统 | 100 | 0 | 0 | 100 |
| 学生信息管理系统 | 60 | 0 | 0 | 60 |
| PETSHOP | 45 | 50 | 0 | 95 |
| 报表系统 | 0 | 90 | 0 | 90 |
| 仓库管理系统 | 0 | 60 | 100 | 160 |
| 超市管理系统 | 0 | 0 | 150 | 150 |
| 会议室预定 | 30 | 0 | 0 | 30 |
+------------------+------+------+------+------+
8 rows in set (0.04 sec)mysql>
SET @EE='';
SELECT @EE:=CONCAT(@EE,'SUM(IF(usercode=\'',usercode,'\'',',WORKHOURS,0)) AS ',usercode,',')
FROM (SELECT DISTINCT usercode FROM baseuser) A;SET @QQ=CONCAT('SELECT PROJECT,',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(WORKHOURS) AS TOTAL from (
select id,usercode,commitdate,PROJECT,WORKHOURS from weekly where PROJECT !=''
union all
select id,usercode,commitdate,PROJECT2,WORKHOURS2 from weekly where PROJECT2 !=''
union all
select id,usercode,commitdate,PROJECT3,WORKHOURS3 from weekly where PROJECT3 !=''
union all
select id,usercode,commitdate,PROJECT4,WORKHOURS4 from weekly where PROJECT4 !=''
union all
select id,usercode,commitdate,PROJECT5,WORKHOURS5 from weekly where PROJECT5 !=''
union all
select id,usercode,commitdate,PROJECT6,WORKHOURS6 from weekly where PROJECT6 !=''
union all
select id,usercode,commitdate,PROJECT7,WORKHOURS7 from weekly where PROJECT7 !=''
union all
select id,usercode,commitdate,PROJECT8,WORKHOURS8 from weekly where PROJECT8 !=''
union all
select id,usercode,commitdate,PROJECT9,WORKHOURS9 from weekly where PROJECT9 !=''
union all
select id,usercode,commitdate,PROJECT10,WORKHOURS10 from weekly where PROJECT10 !=''
) t
group by PROJECT WITH ROLLUP');PREPARE stmt2 FROM @QQ;EXECUTE stmt2;mysql> EXECUTE stmt2;
+------------------+----------+-------+
| PROJECT | zhangsan | TOTAL |
+------------------+----------+-------+
| | 0 | 0 |
| PETSHOP | 45 | 45 |
| 仓库管理系统 | 0 | 160 |
| 会议室预定 | 30 | 30 |
| 图书管理系统 | 40 | 40 |
| 学生信息管理系统 | 60 | 60 |
| 报表系统 | 0 | 90 |
| 超市管理系统 | 0 | 150 |
| NULL | 175 | 575 |
+------------------+----------+-------+
9 rows in set (0.00 sec)
还有点问题请指点下:
1、动态的情况结果怎么不对啊
2、还有你那个静态的结果,包括表头,正是我要生成的Excel,也是我的最终目的;但是执行sql得到的结果集好像没有存储列名吧,就是PROJECT | 张三 | 李四 | 王五 | 合计 这些信息,关于这方面有什么好的方法呢
SELECT @EE:=CONCAT(@EE,'SUM(IF(usercode=\'',usercode,'\'',',WORKHOURS,0)) AS `',fullname,'`,')
FROM baseuser;SET @QQ=CONCAT('SELECT PROJECT,',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(WORKHOURS) AS TOTAL from (
select id,usercode,commitdate,PROJECT,WORKHOURS from weekly where PROJECT !=\'\'
union all
select id,usercode,commitdate,PROJECT2,WORKHOURS2 from weekly where PROJECT2 !=\'\'
union all
select id,usercode,commitdate,PROJECT3,WORKHOURS3 from weekly where PROJECT3 !=\'\'
union all
select id,usercode,commitdate,PROJECT4,WORKHOURS4 from weekly where PROJECT4 !=\'\'
union all
select id,usercode,commitdate,PROJECT5,WORKHOURS5 from weekly where PROJECT5 !=\'\'
union all
select id,usercode,commitdate,PROJECT6,WORKHOURS6 from weekly where PROJECT6 !=\'\'
union all
select id,usercode,commitdate,PROJECT7,WORKHOURS7 from weekly where PROJECT7 !=\'\'
union all
select id,usercode,commitdate,PROJECT8,WORKHOURS8 from weekly where PROJECT8 !=\'\'
union all
select id,usercode,commitdate,PROJECT9,WORKHOURS9 from weekly where PROJECT9 !=\'\'
union all
select id,usercode,commitdate,PROJECT10,WORKHOURS10 from weekly where PROJECT10 !=\'\'
) t
group by PROJECT WITH ROLLUP');PREPARE stmt2 FROM @QQ;EXECUTE stmt2;
mysql> EXECUTE stmt2;
+------------------+------+------+------+-------+
| PROJECT | 张三 | 李四 | 王五 | TOTAL |
+------------------+------+------+------+-------+
| 通勤系统 | 90 | 0 | 0 | 90 |
| 图书管理系统 | 100 | 0 | 0 | 100 |
| 学生信息管理系统 | 60 | 0 | 0 | 60 |
| PETSHOP | 45 | 50 | 0 | 95 |
| 报表系统 | 0 | 90 | 0 | 90 |
| 仓库管理系统 | 0 | 60 | 100 | 160 |
| 超市管理系统 | 0 | 0 | 150 | 150 |
| 会议室预定 | 30 | 0 | 0 | 30 |
| NULL | 325 | 200 | 250 | 775 |
+------------------+------+------+------+-------+
9 rows in set (0.00 sec)mysql>