mysql 纵表转横表,高手请支招

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 纵表转横表,高手请支招相关的知识,希望对你有一定的参考价值。

表数据如图,第一列 员工ID 第二列打卡时间,问题 如何通过sql语句将数据转换成 员工ID 打卡日期 开始时间 结束时间 四列

你这个需要后台处理一下才可以,直接转换比较麻烦,效率也不高。因为你需要计算出每天的开始时间和结束时间insert into newtable select employeeID,days,MAX(cardTime) as endtime,Min(cardTime) as starttime from
table group by employeeID,days; 大概就这意思,自己在调试调试吧
参考技术A 你这里面也没有结束时间啊

你把打卡时间那列删除
ALTER TABLE table_name ADD column_name datatype

添加结束时间列不就行了
ALTER TABLE table_name DROP COLUMN column_name追问

一个人打几次卡就有几条记录,纵列排的。

追答

现在不是一个人打几次卡 几条数据吗?
你的员工ID是不是主键?

sql 纵表转横表


DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (‘1‘, ‘语文‘);
INSERT INTO `course` VALUES (‘2‘, ‘数学‘);
INSERT INTO `course` VALUES (‘3‘, ‘英语‘);


-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sid` int(11) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;


-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (‘1‘, ‘1‘, ‘1‘, ‘60‘);
INSERT INTO `score` VALUES (‘2‘, ‘1‘, ‘2‘, ‘87‘);
INSERT INTO `score` VALUES (‘3‘, ‘1‘, ‘3‘, ‘64‘);
INSERT INTO `score` VALUES (‘4‘, ‘2‘, ‘1‘, ‘76‘);
INSERT INTO `score` VALUES (‘5‘, ‘2‘, ‘2‘, ‘98‘);
INSERT INTO `score` VALUES (‘6‘, ‘2‘, ‘3‘, ‘73‘);
INSERT INTO `score` VALUES (‘7‘, ‘3‘, ‘1‘, ‘22‘);
INSERT INTO `score` VALUES (‘8‘, ‘3‘, ‘2‘, ‘62‘);
INSERT INTO `score` VALUES (‘9‘, ‘3‘, ‘3‘, ‘48‘);
INSERT INTO `score` VALUES (‘10‘, ‘4‘, ‘1‘, ‘77‘);
INSERT INTO `score` VALUES (‘11‘, ‘4‘, ‘2‘, ‘47‘);
INSERT INTO `score` VALUES (‘12‘, ‘4‘, ‘3‘, ‘65‘);
INSERT INTO `score` VALUES (‘13‘, ‘5‘, ‘1‘, ‘84‘);
INSERT INTO `score` VALUES (‘14‘, ‘5‘, ‘2‘, ‘88‘);
INSERT INTO `score` VALUES (‘15‘, ‘5‘, ‘3‘, ‘75‘);
INSERT INTO `score` VALUES (‘16‘, ‘6‘, ‘1‘, ‘98‘);
INSERT INTO `score` VALUES (‘17‘, ‘6‘, ‘2‘, ‘76‘);
INSERT INTO `score` VALUES (‘18‘, ‘6‘, ‘3‘, ‘66‘);
INSERT INTO `score` VALUES (‘19‘, ‘7‘, ‘1‘, ‘67‘);
INSERT INTO `score` VALUES (‘20‘, ‘7‘, ‘2‘, ‘93‘);
INSERT INTO `score` VALUES (‘21‘, ‘7‘, ‘3‘, ‘74‘);


-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (‘1‘, ‘张三‘, ‘12‘);
INSERT INTO `student` VALUES (‘2‘, ‘李四‘, ‘12‘);
INSERT INTO `student` VALUES (‘3‘, ‘王五‘, ‘12‘);
INSERT INTO `student` VALUES (‘4‘, ‘赵柳‘, ‘12‘);
INSERT INTO `student` VALUES (‘5‘, ‘田七‘, null);



SELECT
s.username, SUM( CASE s.`name` WHEN 语文 THEN s.score END ) AS yuwne, SUM( CASE s.`name` WHEN 语文 THEN s.score END ) AS shuxue, SUM( CASE s.`name` WHEN 语文 THEN s.score END ) AS yinyu FROM ( SELECT student.username, course.`name`, score.score FROM score JOIN student ON student.id = score.sid JOIN course ON course.id = score.cid ) s GROUP BY s.username

 






























































以上是关于mysql 纵表转横表,高手请支招的主要内容,如果未能解决你的问题,请参考以下文章

sql 纵表转横表

SQL Server之纵表与横表互转

oracle sql 中 如何实现table的行列转换?

纵表与横表互转实例

SQL纵表与横表互转

Sql的行列转换