两个数据表:
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请教各位这样的查询应该如何实现!

解决方案 »

  1.   

    参考下贴中多种方案。http://blog.csdn.net/acmain_chm/article/details/4283943MySQL交叉表
    在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html?96198现整理解法如下:数据样本: create table tx(  id int primary key,  c1 c...
      

  2.   

    用字符串累加生成SQL语句再执行的方法
      

  3.   

    我是学oracle的,我对MySQL不太熟悉,正好看到你这个提问,我就现学现用,语法不熟悉,捣鼓了1个多小时。就用你提供的数据A表和B表。开发工具为——Toad For MySQL 
    数据: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;结果为:不知道什么原因,这里的中文显示为乱码,高手指教一下。