TIDB 行转列和列转行操作(附SQL实战)

2024年 5月 7日 79.3k 0

TiDB是一款常用的分布式数据库,广泛应用于各种类型的应用程序和数据存储需求。我们经常需要对表进行行转列或列转行的操作,以满足不同的分析或报表需求。本文将详细介绍TiDB中的行转列和列转行操作,并提供相应的SQL语句进行操作。

行转列

行转列操作指的是将表格中一行数据转换为多列数据的操作。由于当前TiDB 暂时未兼容oracle pivot函数,我们通过CTE递归功能,可以动态实现列值不固定内容的情况进行转换,示例如下:

mysql> select * from t10;
+------------+
| id         |
+------------+
| abc,djd,ed |
| dd,oe     |
+------------+
2 rows in set (0.00 sec)
​
mysql> WITH RECURSIVE split_values AS (  
  ->   SELECT   
  ->     id, 
  ->     SUBSTRING_INDEX(id, ',', 1) AS value,  
  ->     SUBSTRING(id, LENGTH(SUBSTRING_INDEX(id, ',', 1)) + 2) AS remaining_values  
  ->   FROM t10  
  ->   UNION ALL  
  ->   SELECT   
  ->     id,  
  ->     SUBSTRING_INDEX(remaining_values, ',', 1),  
  ->     SUBSTRING(remaining_values, LENGTH(SUBSTRING_INDEX(remaining_values, ',', 1)) + 2)  
  ->   FROM split_values  
  ->   WHERE remaining_values != '' )  
  -> SELECT   
  ->   id,  
  ->   value  
  -> FROM split_values  
  -> WHERE value != '';
+------------+-------+
| id         | value |
+------------+-------+
| abc,djd,ed | abc   |
| dd,oe     | dd   |
| abc,djd,ed | djd   |
| dd,oe     | oe   |
| abc,djd,ed | ed   |
+------------+-------+
5 rows in set (0.00 sec)
​

列转行

列转行操作指的是将表格中多列数据转换为一行数据的操作。在TIDB兼容已group_concat,可以使用此函数进行快速实现,示例如下:

mysql> select * from t11;
+------+
| id   |
+------+
| sdj |
| sdd |
| xdd |
| xcd |
+------+
4 rows in set (0.01 sec)
​
mysql> select group_concat(id) from t11;
+------------------+
| group_concat(id) |
+------------------+
| sdj,sdd,xdd,xcd  |
+------------------+
1 row in set (0.01 sec)

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论