两个数据表:
A
courseid, coursename
1, 语文
2, 数学
B
id, student, courseid,
1, 张三, 1, 90
2, 李四, 1, 80
3, 张三, 2, 70
4, 李四, 2, 80
现在想用转置表的方法转成二维表输出,要求格式是:
student, 语文, 数学
张三, 90, 70
李四, 80, 80如果A表中的记录增加为
A
courseid, coursename
1, 语文
2, 数学
3, 天文那么查询结果希望也变化
student, 语文, 数学,天文
张三, 90, 70, 0
李四, 80, 80, 0请教各位这样的查询应该如何实现!
A
courseid, coursename
1, 语文
2, 数学
B
id, student, courseid,
1, 张三, 1, 90
2, 李四, 1, 80
3, 张三, 2, 70
4, 李四, 2, 80
现在想用转置表的方法转成二维表输出,要求格式是:
student, 语文, 数学
张三, 90, 70
李四, 80, 80如果A表中的记录增加为
A
courseid, coursename
1, 语文
2, 数学
3, 天文那么查询结果希望也变化
student, 语文, 数学,天文
张三, 90, 70, 0
李四, 80, 80, 0请教各位这样的查询应该如何实现!
在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html?96198现整理解法如下:数据样本: create table tx( id int primary key, c1 c...
数据:DROP PROCEDURE IF EXISTS employees.pr_row_col_format;
CREATE PROCEDURE employees.pr_row_col_format()
SQL SECURITY INVOKER
BEGIN
DECLARE vObject VARCHAR(20);
DECLARE DONE INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT DISTINCT coursename FROM A;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
SET @vSQL = 'SELECT B.STUDENT,';
OPEN cur1;
test: REPEAT
FETCH cur1 INTO vObject;
IF NOT DONE THEN
SET @vSQL = CONCAT(@vSQL, 'SUM(IF(A.COURSENAME = ','''',vObject,'''',',MARK,0)) ',vObject, ', ');
END IF;
UNTIL DONE
END REPEAT test;
SET @vSQL = LEFT(@vSQL, CHAR_LENGTH(@vSQL)-2);
SET @vSQL = CONCAT(@vSQL, ' FROM B JOIN A USING (COURSEID) GROUP BY B.STUDENT');
CLOSE cur1;
PREPARE vStmt FROM @vSQL;
EXECUTE vStmt;
END;结果为:不知道什么原因,这里的中文显示为乱码,高手指教一下。