一般的行列转换都只针对数值型(int或double类型),这种情况下可以利用聚集函数(如SUM)来实现转置,网上也有比较完善的解决方案,可参考
http://blog.chinaunix.net/u3/90603/showart_2017912.html
但是如果要对字符串类型或日期等其他类型进行转置,情况则复杂很多了,这里进行了一些尝试,不需要借助存储过程或函数,也实现了这个转置。
源表:
ROW | PROPERTY | VALUE |
1 | name | Andy |
1 | address | Beijing |
1 | remark | test |
2 | name | Bill |
2 | address | Shanghai |
目标表:
ROW | name | address | remark |
1 | Andy | Beijing | test |
2 | Bill | Shanghai | NULL |
这是个简单的例子,下面的情况还要稍微复杂一些:
源表(
table1):
row | code | s | i | d | f |
9000714 | idcard | 88888888 | NULL | NULL | NULL |
9000714 | appdate | NULL | NULL | 2009-01-02 00:00:00 | NULL |
9000714 | age | NULL | 11 | NULL | NULL |
9000714 | name | Andy | NULL | NULL | NULL |
9000719 | name | Bill | NULL | NULL | NULL |
9000719 | age | NULL | 22 | NULL | NULL |
9000719 | idcard | 66666666 | NULL | NULL | NULL |
9000719 | appdate | NULL | NULL | 2008-11-22 00:00:00 | NULL |
目标表:
row | name | age | idcard | appdate |
9000714 | Andy | 11 | 88888888 | 2009-01-02 00:00:00 |
9000719 | Bill | 22 | 66666666 | 2008-11-22 00:00:00 |
第一步:先得到下面这个初步转置的中间表
row | idcard | name | age | appdate |
9000714 | NULL | NULL | NULL | 2009-01-0200:00:00 |
9000714 | NULL | NULL | 11 | NULL |
9000714 | 88888888 | NULL | NULL | NULL |
9000714 | NULL | Andy | NULL | NULL |
9000719 | NULL | NULL | NULL | 2008-11-2200:00:00 |
9000719 | NULL | NULL | 22 | NULL |
9000719 | 66666666 | NULL | NULL | NULL |
9000719 | NULL | Bill | NULL | NULL |
SELECT row,
CASE WHEN code = 'idcard' THEN s END AS 'idcard',
CASE WHEN code = 'name' THEN s END AS 'name',
CASE WHEN code = 'age' THEN i END AS 'age',
CASE WHEN code = 'appdate' THEN d END AS 'appdate'
FROM table1
GROUP BY row, code, s, d, i, f
第二部:进行分组聚合,可以得到目标表,sql如下:
SELECT row,
cast(group_concat(CASE WHEN cast(age as char) IS NOT NULL THEN age ELSE NULL END ) as signed) AS 'age',
group_concat(CASE WHEN name IS NOT NULL THEN name END ) AS 'name',
group_concat(CASE WHEN idcard IS NOT NULL THEN idcard END ) AS 'idcard',
cast(group_concat(CASE WHEN cast(appdate as char) IS NOT NULL THEN appdate ELSE NULL END ) as datetime) AS 'appdate'
FROM (
SELECT row,
CASE WHEN code = 'idcard' THEN s END AS 'idcard',
CASE WHEN code = 'name' THEN s END AS 'name',
CASE WHEN code = 'age' THEN i END AS 'age',
CASE WHEN code = 'appdate' THEN d END AS 'appdate'
FROM table1
GROUP BY row, code, s, d, i, f
)t
GROUP BY row
对于int型的age字段,可以用sum即可,但是采用下面的写法是为了统一转换的过程(所有类型都通过group_concat来处理),即把int型先转换成char型,用group_concat拼接完成后再转换成int型(datetime型也是这样处理的),这个处理只适用于同一个row只有一个age值:
cast(group_concat(CASE WHEN cast(age as char) IS NOT NULL THEN age ELSE NULL END ) as signed) AS 'age'
也可以换成下面的sql:
SUM(CASE WHEN age IS NOT NULL THEN age ELSE 0 END ) AS 'age'
(appdate字段解释类似)
另外,由于SQL Server和Oracle中没有类似于group_concat的函数,实现起来好像要麻烦很多。
附:相关sql
CREATE TABLE `table1` (
`row` int(20) default NULL,
`code` varchar(255) default NULL,
`s` varchar(8000) default NULL,
`d` datetime default NULL,
`i` int(20) default NULL,
`f` float default NULL
);
INSERT INTO table1 VALUES (9000714, 'idcard', '88888888', NULL, NULL, NULL );
INSERT INTO table1 VALUES (9000714, 'appdate', NULL, '2009-01-02 00:00:00', NULL, NULL );
INSERT INTO table1 VALUES (9000714, 'age', NULL, NULL, 11, NULL);
INSERT INTO table1 VALUES (9000714, 'name', 'Andy', NULL, NULL, NULL );
INSERT INTO table1 VALUES (9000719, 'name', 'Bill', NULL, NULL, NULL );
INSERT INTO table1 VALUES (9000719, 'age', NULL, NULL, 22, NULL );
INSERT INTO table1 VALUES (9000719, 'idcard', '66666666', NULL, NULL, NULL );
INSERT INTO table1 VALUES (9000719, 'appdate', NULL, '2008-11-22 00:00:00', NULL, NULL );
分享到:
相关推荐
通过c/c++编写对字符串转置 完美运行 过程简洁
字符串转置,字符串的逆置
这可能包括创建字符串,拼接字符串,格式化数字,以及可能使用某些字符串函数。通过学习这个示例,你将能够更好地掌握MATLAB中的字符串处理技巧,这对于编写MATLAB程序来说是非常有用的。 总结,MATLAB的字符串处理...
本书针对程序设计的初学者,以面向对象的程序设计思想为主线,以通俗易懂的方法介绍C++语言,引导读者以最自然的方式,将人类习惯的面向对象的思维方法运用到程序设计中。主要内容包括程序设计基础知识、类与对象的...
两种方案实现SQL SERVER 转置功能1.拼字符串实现转置2.PIVOT
存储过程中首先声明了一些变量,包括@start和@end,这两个变量用于指定查询的时间范围。然后,代码使用了游标来遍历rjz表中的数据,并将数据转换为列式结构。最后,代码使用了dynamic SQL来实现查询结果的转置。 在...
* 转置字符串数组:可以使用 ' 运算符来转置字符串数组,例如:names = names'; 三、函数调用 在 Matlab 中,函数调用是通过函数名和参数列表来实现的,例如:[a, b] = f(2, 3);。函数可以返回多个值,可以使用 []...
- 如果数据区域包含公式,转置后公式中的相对引用会根据新的位置自动调整,这可能会导致计算结果的变化。 - 转置操作是不可逆的,一旦执行,原始数据将被覆盖,因此在操作前最好备份重要数据。 - 对于大型数据集,...
C++矩阵转置代码!
- **实现逻辑**:通过双重循环遍历矩阵的每一行和每一列,并将每个元素转换成字符串形式输出。 ##### 3. `transpose(int[][] sourceMatrix)` - **功能描述**:此方法用于实现矩阵的转置操作。 - **参数**: - `...
在这个名为"CUDA中矩阵加减运算以及转置运算"的项目中,我们将深入探讨如何在CUDA环境下进行矩阵的加减和转置操作。 首先,CUDA编程主要涉及两个关键组件:主机代码(Host Code)和设备代码(Device Code)。主机...
在提供的压缩包文件中,可能包含了更具体的VB代码示例,用于演示如何在实际项目中实现矩阵转置。通过学习和理解这些示例,你可以更好地掌握VB处理矩阵转置的技巧,并将其应用到自己的编程实践中。
当用户触发转置操作时,JavaScript通过Ajax发送请求到服务器,服务器上的Java应用程序接收并处理请求,可能包括验证权限、处理数据、生成新的表格结构,然后将结果返回给前端。Spring MVC或Struts2等框架常用于构建...
关于数据结构中矩阵的转置的实现 代码详解
此外,上述代码中使用的`iostream.h`是C++早期版本中使用的头文件,现代C++推荐使用`#include <iostream>`来包含标准输入输出流库,而`main`函数应该返回一个`int`类型,并在函数末尾返回`0`来表示程序正常退出。...
在转置过程中,根据原矩阵的存储形式选择合适的转置方法,以保持最优的存储效率。 总结,理解和实现稀疏矩阵的转置是数据结构课程中的重要课题,它涉及到高效的数据结构和算法设计,有助于提升大规模数据处理的性能...
《算法-矩阵转置(信息学奥赛一本通-T1126)》是一本针对信息学竞赛的指导书籍,其中包含了关于矩阵转置的重要知识和源程序。矩阵转置是线性代数中的基本概念,对于理解算法和解决实际问题具有重要意义。在这里,...
- 字符串排序示例中,通过使用`strcmp`函数比较字符串大小,`strcpy`函数复制字符串,并自定义`swap`函数来交换字符串的位置。 ### 实验任务二:矩阵转置 **目标**:编写一个函数,实现3x3矩阵的转置。 **示例...
总的来说,矩阵乘法和转置是线性代数中的基础运算,它们在编程中有着广泛的应用。通过理解和熟练掌握这些概念,可以帮助开发者解决涉及矩阵运算的实际问题,如图像处理中的滤波、机器学习中的权重更新等。在C语言中...