用SQL实现行列转换的一个例子
2007-11-20 13:53
423 查看
| |
[align=left]我的实践例子:[/align] [align=left] [/align] [align=left]table: CREATE TABLE TEST (XM VARCHAR(8), SL INTEGER); INSERT INTO TEST VALUES ('王一', 2), ('王一', 5), ('张二', 4), ('张二', 5), ('张二', 8), ('李三', 2), ('李三', 4), ('李三', 15), ('李三', 29);[/align] [align=left] [/align] [align=left] case 1:[/align] [align=left] [/align] [align=left]WITH B (FATHER,SON,XM,CHAIN) AS (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CAST(CHAR(A.SL) AS VARCHAR(100)) FROM TEST A UNION ALL SELECT C.FATHER,C.SON,C.XM,B.CHAIN || C.XM || ' ' || C.SL FROM (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CHAR(A.SL) AS SL FROM TEST A) AS C, B WHERE B.SON= C.FATHER)[/align] [align=left] [/align] [align=left] SELECT D.XM || ' ' || D.CHAIN FROM (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D WHERE D.ROW_NUM = 1;[/align] [align=left] [/align] [align=left]result: 李三 2 李三 4 李三 15 李三 29 王一 2 王一 5 张二 4 张二 5 张二 8[/align] [align=left] [/align] [align=left]case 2:[/align] [align=left] [/align] [align=left]WITH B (FATHER,SON,XM,CHAIN) AS (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, rtrim(ltrim(CHAR(A.SL))) FROM TEST A UNION ALL SELECT C.FATHER,C.SON,C.XM,rtrim(ltrim(B.CHAIN))||','||rtrim(ltrim(C.SL)) FROM (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER, A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, rtrim(ltrim(CHAR(A.SL))) AS SL FROM TEST A) AS C, B WHERE B.SON= C.FATHER) [/align] [align=left] [/align] [align=left] SELECT D.XM,D.CHAIN FROM (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D WHERE D.ROW_NUM = 1;[/align] [align=left] [/align] [align=left]result: XM CHAIN -------- ----------- 李三 2,4,15,29 王一 2,5 张二 4,5,8[/align] [align=left] [/align] [align=left] case 3:[/align] [align=left] [/align] [align=left]WITH B (FATHER,SON,XM,CHAIN) AS (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, rtrim(ltrim(CHAR(A.SL))) FROM TEST A UNION ALL SELECT C.FATHER,C.SON,C.XM,rtrim(ltrim(B.CHAIN))||rtrim(ltrim(C.SL)) FROM (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER, A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, rtrim(ltrim(CHAR(A.SL))) AS SL FROM TEST A) AS C, B WHERE B.SON= C.FATHER) -- end with[/align] [align=left] [/align] [align=left] SELECT D.XM,D.CHAIN FROM (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D WHERE D.ROW_NUM = 1;[/align] [align=left] [/align] [align=left]result: XM CHAIN -------- ----------- 李三 241529 王一 25 张二 458 [/align] |
相关文章推荐
- 一个使用sql实现分页的例子
- SQL面试题练习-实现pivot行列转换
- Oracle一个典型行列转换的几种实现方法(转)
- 【转】SQL中关于case关键字的例子(行列转换)
- SQL中关于case关键字的例子(行列转换)
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
- 用SQL行列转换实现数据透视的一些思考
- 一个SQL语句的问题:行列转换
- sql为了实现转换的行列
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- SQL 实现行列转换示例
- 一个简单的SQL 行列转换语句
- Oracle一个典型行列转换的几种实现方法
- 动态SQL的使用例子, 行列转换.
- 一个简单的SQL 行列转换语句
- sql游标实现行列转换
- Oracle一个典型行列转换的几种实现方法
- sql2005 行列转换的例子
- Oracle10g中又一个行列转换的例子.