MySQL 透视 table 子字符串列名称
MySQL Pivot table substring column names
我在 MySQL 数据库中有一个 table 结构,如下所示:
Table 数据:
Ref | Var | 3SAa combined % | 3SAa combined of | 3SAa Forward of |3SAa Forward % | 3SAa reverse % | 3SAa Forward of|
---------------------------------------------------------------------------------------------------------------------
AL23 TT 0.00 38.78 48.39 100.0 12.01 85.3
我想要的输出如下:
ID | Ref |Var |a combined % | a combined of | a Forward of |a Forward % | a reverse % | a Forward of|
--------------------------------------------------------------------------------------------------------
3SA AL23 TT 0.00 38.78 48.39 100.0 12.01 85.3
我想知道是否有任何方法可以用 MySQL 做到这一点。大问题,我从来没有找到任何截断列名的子字符串函数。
您可以在您的数据库上测试我的查询。您只需设置前两个变量。包含字符串的表名和行号。
SET @table_name = 'mytab';
SET @col_id = 3;
SELECT DATABASE() INTO @dbname;
SELECT SUBSTRING_INDEX(COLUMN_NAME,' ' , 1) INTO @id_name
FROM information_schema.columns
WHERE table_schema = @dbname
AND TABLE_NAME = @table_name
AND ORDINAL_POSITION = @col_id;
SELECT CONCAT('SELECT \'', @id_name, '\' AS Id, ' , GROUP_CONCAT(
CONCAT( '`',COLUMN_NAME,'`')
, ' AS `', REPLACE(COLUMN_NAME,CONCAT(@id_name,' ') , '')
,'`\n' ), ' FROM ', @table_name) INTO @sql
FROM information_schema.columns
WHERE table_schema = @dbname
AND TABLE_NAME = @table_name
ORDER BY ORDINAL_POSITION;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
测试
MariaDB []> SELECT * FROM mytab;
+------+------+-----------------+------------------+
| Ref | Var | 3SAa combined % | 3SAa combined of |
+------+------+-----------------+------------------+
| AL23 | | 0.00 | 38.78 |
+------+------+-----------------+------------------+
1 row in set (0.00 sec)
MariaDB []> SET @table_name = 'mytab';
Query OK, 0 rows affected (0.00 sec)
MariaDB [bernd]> SET @col_id = 3;
Query OK, 0 rows affected (0.00 sec)
MariaDB []> SELECT DATABASE() INTO @dbname;
Query OK, 1 row affected (0.00 sec)
MariaDB []> SELECT SUBSTRING_INDEX(COLUMN_NAME,' ' , 1) INTO @id_name
-> FROM information_schema.columns
-> WHERE table_schema = @dbname
-> AND TABLE_NAME = @table_name
-> AND ORDINAL_POSITION = @col_id;
Query OK, 1 row affected (0.01 sec)
MariaDB []> SELECT CONCAT('SELECT \'', @id_name, '\' AS Id, ' , GROUP_CONCAT(
-> CONCAT( '`',COLUMN_NAME,'`')
-> , ' AS `', REPLACE(COLUMN_NAME,CONCAT(@id_name,' ') , '')
-> ,'`\n' ), ' FROM ', @table_name) INTO @sql
-> FROM information_schema.columns
-> WHERE table_schema = @dbname
-> AND TABLE_NAME = @table_name
-> ORDER BY ORDINAL_POSITION;
Query OK, 1 row affected (0.01 sec)
MariaDB []> PREPARE stmt FROM @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
MariaDB []> EXECUTE stmt;
+------+------+------+------------+-------------+
| Id | Ref | Var | combined % | combined of |
+------+------+------+------------+-------------+
| 3SAa | AL23 | | 0.00 | 38.78 |
+------+------+------+------------+-------------+
1 row in set (0.00 sec)
MariaDB []> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
请告诉我它是否适合你
我在 MySQL 数据库中有一个 table 结构,如下所示:
Table 数据:
Ref | Var | 3SAa combined % | 3SAa combined of | 3SAa Forward of |3SAa Forward % | 3SAa reverse % | 3SAa Forward of|
---------------------------------------------------------------------------------------------------------------------
AL23 TT 0.00 38.78 48.39 100.0 12.01 85.3
我想要的输出如下:
ID | Ref |Var |a combined % | a combined of | a Forward of |a Forward % | a reverse % | a Forward of|
--------------------------------------------------------------------------------------------------------
3SA AL23 TT 0.00 38.78 48.39 100.0 12.01 85.3
我想知道是否有任何方法可以用 MySQL 做到这一点。大问题,我从来没有找到任何截断列名的子字符串函数。
您可以在您的数据库上测试我的查询。您只需设置前两个变量。包含字符串的表名和行号。
SET @table_name = 'mytab';
SET @col_id = 3;
SELECT DATABASE() INTO @dbname;
SELECT SUBSTRING_INDEX(COLUMN_NAME,' ' , 1) INTO @id_name
FROM information_schema.columns
WHERE table_schema = @dbname
AND TABLE_NAME = @table_name
AND ORDINAL_POSITION = @col_id;
SELECT CONCAT('SELECT \'', @id_name, '\' AS Id, ' , GROUP_CONCAT(
CONCAT( '`',COLUMN_NAME,'`')
, ' AS `', REPLACE(COLUMN_NAME,CONCAT(@id_name,' ') , '')
,'`\n' ), ' FROM ', @table_name) INTO @sql
FROM information_schema.columns
WHERE table_schema = @dbname
AND TABLE_NAME = @table_name
ORDER BY ORDINAL_POSITION;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
测试
MariaDB []> SELECT * FROM mytab;
+------+------+-----------------+------------------+
| Ref | Var | 3SAa combined % | 3SAa combined of |
+------+------+-----------------+------------------+
| AL23 | | 0.00 | 38.78 |
+------+------+-----------------+------------------+
1 row in set (0.00 sec)
MariaDB []> SET @table_name = 'mytab';
Query OK, 0 rows affected (0.00 sec)
MariaDB [bernd]> SET @col_id = 3;
Query OK, 0 rows affected (0.00 sec)
MariaDB []> SELECT DATABASE() INTO @dbname;
Query OK, 1 row affected (0.00 sec)
MariaDB []> SELECT SUBSTRING_INDEX(COLUMN_NAME,' ' , 1) INTO @id_name
-> FROM information_schema.columns
-> WHERE table_schema = @dbname
-> AND TABLE_NAME = @table_name
-> AND ORDINAL_POSITION = @col_id;
Query OK, 1 row affected (0.01 sec)
MariaDB []> SELECT CONCAT('SELECT \'', @id_name, '\' AS Id, ' , GROUP_CONCAT(
-> CONCAT( '`',COLUMN_NAME,'`')
-> , ' AS `', REPLACE(COLUMN_NAME,CONCAT(@id_name,' ') , '')
-> ,'`\n' ), ' FROM ', @table_name) INTO @sql
-> FROM information_schema.columns
-> WHERE table_schema = @dbname
-> AND TABLE_NAME = @table_name
-> ORDER BY ORDINAL_POSITION;
Query OK, 1 row affected (0.01 sec)
MariaDB []> PREPARE stmt FROM @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
MariaDB []> EXECUTE stmt;
+------+------+------+------------+-------------+
| Id | Ref | Var | combined % | combined of |
+------+------+------+------------+-------------+
| 3SAa | AL23 | | 0.00 | 38.78 |
+------+------+------+------------+-------------+
1 row in set (0.00 sec)
MariaDB []> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
请告诉我它是否适合你