微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用数据透视表连接使用 Mysql 8 版本的表

如何解决使用数据透视表连接使用 Mysql 8 版本的表

我有这两个表 t1t2 存储了一个数据库 MysqL 版本 8.0.17

需要说明的是,表 t2 可以包含数千行不同的单元代码(字段 sUn)...

相反,表 t1 仅包含每个单元的方式和代码(字段 TABLE_NAME

-- ----------------------------
-- Table structure for t1
-- ----------------------------
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1`  (
  `TABLE_NAME` varchar(255) DEFAULT NULL,`tDDMMYYHHMMSS` datetime DEFAULT NULL,`sID` int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`sID`) USING BTREE,UNIQUE INDEX `TABLE_NAME`(`TABLE_NAME`) USING BTREE
) ENGINE = InnoDB;

-- ----------------------------
-- Records of t1
-- ----------------------------
INSERT INTO `t1` VALUES ('100','2021-04-09 12:44:30',1);
INSERT INTO `t1` VALUES ('11c',2);
INSERT INTO `t1` VALUES ('11f',3);
INSERT INTO `t1` VALUES ('12a',4);
INSERT INTO `t1` VALUES ('12h',5);

-- ----------------------------
-- Table structure for t2
-- ----------------------------
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2`  (
  `sid` int(11) NOT NULL AUTO_INCREMENT,`sUn` varchar(255) DEFAULT NULL,`sUnName` varchar(255) DEFAULT NULL,`sContents` longtext NULL,PRIMARY KEY (`sid`) USING BTREE
) ENGINE = InnoDB;

-- ----------------------------
-- Records of t2
-- ----------------------------
INSERT INTO `t2` VALUES (1,'100','nor','Ipsa sua melior fama.');
INSERT INTO `t2` VALUES (2,'In toto.');
INSERT INTO `t2` VALUES (3,'Homines,nihil agendo.');
INSERT INTO `t2` VALUES (4,'11C','SAR','Habere non haberi.');
INSERT INTO `t2` VALUES (5,'Vivere est cogitare.');
INSERT INTO `t2` VALUES (6,'Urbi et Orbi.');
INSERT INTO `t2` VALUES (7,'11F','SAD','Inter sidera versor.');
INSERT INTO `t2` VALUES (8,'Una tantum.');
INSERT INTO `t2` VALUES (9,'Carthago delenda est.');
INSERT INTO `t2` VALUES (10,'12A','RIV','Status quo.');
INSERT INTO `t2` VALUES (11,'Aut aut.');
INSERT INTO `t2` VALUES (12,'Condicio sine qua non.\r\n');
INSERT INTO `t2` VALUES (13,'12H','CUN','Ubi maior minor cessat.');
INSERT INTO `t2` VALUES (14,'Carpe diem.');
INSERT INTO `t2` VALUES (15,'venni,vidi,vinsi.');

我已经尝试过 -没有成功- 一个查询数据透视表将这两个表连接起来以获得此返回

+------------------------+----------------------+-----------------------+------------------------+-------------------------+
| nor                    | SAR                  | SAD                   | RIV                    | CUN                     |
+------------------------+----------------------+-----------------------+------------------------+-------------------------+
| Ipsa sua melior fama.  | Habere non haberi.   | Inter sidera versor.  | Status quo.            | Ubi maior minor cessat. |
| In toto.               | Vivere est cogitare. | Una tantum.           | Aut aut.               | Carpe diem.             |
| Homines,nihil agendo. | Urbi et Orbi.        | Carthago delenda est. | Condicio sine qua non. | venni,vinsi.     |
+------------------------+----------------------+-----------------------+------------------------+-------------------------+

我在下面的查询错误

任何帮助将不胜感激...谢谢。

SELECT
    max(
    IF
    ( t.sUn = q.TABLE_NAME,t.sContents,NULL )) q.sUnName
FROM
    ( SELECT row_number() over ( PARTITION BY sUn ORDER BY sID ) AS rn,tcs.sUn,tcs.sContents FROM t2 AS tcs ) AS t    
    JOIN t1 q ON t.sUn = q.TABLE_NAME   
GROUP BY
    rn 
ORDER BY
    rn

1064 - 您的 sql 语法有错误;检查与您的 MysqL 服务器版本相对应的手册,了解在 '.sUnName 附近使用的正确语法 从 ( SELECT row_number() over ( PARTITION BY sUn ORDER BY sID ) AS' 在第 4 行 > 时间:0,001s

更新

使用存储过程的新版本...

CREATE DEFINER=`root`@`localhost` PROCEDURE `pivot_20210409`()
BEGIN

SET SESSION group_concat_max_len = 1000000;

SELECT
  CONCAT('SELECT ',GROUP_CONCAT(
      CONCAT (
        "IF(`sUnName` = '",sUnName,'\',sContents,NULL) AS `','`'
      )
    ),' FROM `t2`'
  ) INTO @sql
FROM
 ( SELECT row_number() over ( PARTITION BY sUn ORDER BY sID ) AS rn,tcs.sUnName,tcs.sContents FROM t2 AS tcs
 GROUP BY tcs.sUnName
) AS data;

SELECT @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END

返回

+------------------------+----------------------+-----------------------+--------------------------+-------------------------+
| nor                    | SAR                  | SAD                   | RIV                      | CUN                     |
+------------------------+----------------------+-----------------------+--------------------------+-------------------------+
| Ipsa sua melior fama.  | NULL                 | NULL                  | NULL                     | NULL                    |
| In toto.               | NULL                 | NULL                  | NULL                     | NULL                    |
| Homines,nihil agendo. | NULL                 | NULL                  | NULL                     | NULL                    |
| NULL                   | Habere non haberi.   | NULL                  | NULL                     | NULL                    |
| NULL                   | Vivere est cogitare. | NULL                  | NULL                     | NULL                    |
| NULL                   | Urbi et Orbi.        | NULL                  | NULL                     | NULL                    |
| NULL                   | NULL                 | Inter sidera versor.  | NULL                     | NULL                    |
| NULL                   | NULL                 | Una tantum.           | NULL                     | NULL                    |
| NULL                   | NULL                 | Carthago delenda est. | NULL                     | NULL                    |
| NULL                   | NULL                 | NULL                  | Status quo.              | NULL                    |
| NULL                   | NULL                 | NULL                  | Aut aut.                 | NULL                    |
| NULL                   | NULL                 | NULL                  | Condicio sine qua non.   | NULL                    |
| NULL                   | NULL                 | NULL                  | NULL                     | Ubi maior minor cessat. |
| NULL                   | NULL                 | NULL                  | NULL                     | Carpe diem.             |
| NULL                   | NULL                 | NULL                  | NULL                     | venni,vinsi.     |
+------------------------+----------------------+-----------------------+--------------------------+-------------------------+

解决方法

在的MySQL,伤心的说,转动是困难的任意命名的列的乱七八糟的事情。

这会得到您想要的结果(db-fiddle.com 上的 dbfiddle,它提供 MySQL 8。)

WITH pivot AS (
  SELECT CASE WHEN SunName = 'NOR' THEN sContents ELSE NULL END NOR,CASE WHEN SunName = 'SAR' THEN sContents ELSE NULL END SAR,CASE WHEN SunName = 'SAD' THEN sContents ELSE NULL END SAD,CASE WHEN SunName = 'RIV' THEN sContents ELSE NULL END RIV,CASE WHEN SunName = 'CUN' THEN sContents ELSE NULL END CUN,sId
   FROM t2
),rownums AS (
  SELECT sId,row_number() OVER ( PARTITION BY sUn ORDER BY sID ) rn FROM t2
)
SELECT MAX(NOR) NOR,MAX(SAR) SAR,MAX(SAD) SAD,MAX(RIV) RIV,MAX(CUN) CUN
  FROM rownums
  JOIN pivot ON rownums.sId = pivot.sId
 GROUP BY rownums.rn

这个讨厌的子查询执行旋转操作。 (fiddle) 看看它是如何枚举列的?这几乎就是你必须做的

  SELECT CASE WHEN SunName = 'NOR' THEN sContents ELSE NULL END NOR,sId
   FROM t2

您可以编写一个使用字符串处理和 MySQL's PREPARE statement 来合成此类查询的存储过程。这是一项相当大的工作。 Advice here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。