qq_39196807 2022-05-18 10:42 采纳率: 83%
浏览 119
已结题

mysql 动态行转列多表怎么实现?

img

表1

img

表2

现有2张表:表1,表2。

表2为动态列与表1的courseid对应

列是根据表2动态生成的,不是固定的。表2有什么列,就生成什么列

查询统计表1相同tags的watchtime合计数 lonigid为索引。

想要的最终效果:

|用户名 | 法律法规          | 工程经济          | 建筑实务          | 市政实务          | 
|gf1001 | wacthtime合计 | wacthtime合计 | wacthtime合计 | wacthtime合计 | 
|gf1002 | wacthtime合计 | wacthtime合计 | wacthtime合计 | wacthtime合计 | 
|gf1003 | wacthtime合计 | wacthtime合计 | wacthtime合计 | wacthtime合计 | 

  • 写回答

5条回答 默认 最新

  • xcLeigh 全栈领域优质创作者 2022-05-18 11:15
    关注

    表tbl_test

    CREATE TABLE `tbl_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) DEFAULT NULL,
      `type` int(11) DEFAULT NULL,
      `money` int(11) DEFAULT NULL,
      `ctime` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
     
    INSERT INTO tbl_test (id, name, type, money, ctime) VALUES ('1', 'mike', '1', '6', '2016-01-01 12:58:00');
    INSERT INTO tbl_test (id, name, type, money, ctime) VALUES ('2', 'mike', '2', '10', '2016-02-01 13:52:56');
    INSERT INTO tbl_test (id, name, type, money, ctime) VALUES ('3', 'leo', '3', '10', '2016-05-02 00:05:05');
    INSERT INTO tbl_test (id, name, type, money, ctime) VALUES ('4', 'mike', '1', '6', '2016-08-03 08:06:05');
    INSERT INTO tbl_test (id, name, type, money, ctime) VALUES ('5', 'mike', '5', '9', '2016-01-01 12:58:00');
    INSERT INTO tbl_test (id, name, type, money, ctime) VALUES ('6', 'mike', '8', '15', '2016-01-01 12:58:00');
    

    表tbl_type

    CREATE TABLE `tbl_type` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `typename` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
    INSERT INTO tbl_type (id, typename) VALUES ('1', '苹果');
    INSERT INTO tbl_type (id, typename) VALUES ('2', '香蕉');
    INSERT INTO tbl_type (id, typename) VALUES ('3', '橙子');
    INSERT INTO tbl_type (id, typename) VALUES ('4', '葡萄');
    INSERT INTO tbl_type (id, typename) VALUES ('5', '梨');
    INSERT INTO tbl_type (id, typename) VALUES ('6', '柠檬');
    INSERT INTO tbl_type (id, typename) VALUES ('7', '桃子');
    INSERT INTO tbl_type (id, typename) VALUES ('8', '西瓜');
    

    存储过程,行列转换,动态获取列标题,列标题从指定表中读取

    ## SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 
     
    DROP PROCEDURE IF EXISTS test_proc;  
    CREATE PROCEDURE test_proc() 
    BEGIN
        DECLARE esql VARCHAR(4000) ;
        DECLARE tid INT;
        DECLARE tname VARCHAR(50);
        DECLARE flag INT DEFAULT 0;
     
        ## 定义一个游标来记录sql查询的结果
        DECLARE t_list CURSOR FOR SELECT id, typename FROM tbl_type ORDER BY id; 
        ## 为下面while循环建立一个退出标志,当游标遍历完后将flag的值设置为1
        DECLARE continue handler for not found SET flag = 1;
     
        SET @esql = 'SELECT CONCAT(LPAD(MONTH(d.ctime), 2, 0), \'月\')  AS \'月份\' ' ;
        -- SET @esql = 'SELECT  month(d.ctime) as \'月份\' ' ;
        
        ## 打开游标
        OPEN t_list;
        ## 将游标中的值赋给定义好的变量,实现for循环的要点
        FETCH t_list INTO  tid, tname;
        WHILE flag <> 1 DO
            ## SELECT  tid, tname;
            SET @tsql = ', sum(if (d.type = ' + tid+ ', d.money, 0 )) AS \'' + tname+ '\''  ;
        ## SELECT @tsql;
        SET @esql = concat(@esql, ', sum(if (d.type = ' , tid , ', d.money, 0 )) AS \'' , tname, '\'' ) ;
        FETCH t_list INTO  tid, tname;
     
        END WHILE ;
        ## 关闭游标
        CLOSE t_list ;
        SET @esql = CONCAT(@esql ,' FROM  tbl_test  d  GROUP BY   month(d.ctime) ;') ;
     
        PREPARE stmt FROM @esql;-- 预编译一条sql语句,并命名为stmt
        EXECUTE stmt;-- 执行预编译sql
     
        ## 拼接完成后可以调用 select @s 语句,查看最终拼接的sql语句是否正确
        ##select @esql;
    END
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 修改了问题 5月18日
  • 赞助了问题酬金5元 5月18日
  • 展开全部

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了