`
ansili
  • 浏览: 55123 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

实现行列转换

阅读更多

构建测试表:

Sql代码
  1. create table TABLE1   
  2. (   
  3.    ID   INTEGER,   
  4.   NAME VARCHAR2(10)   
  5. )   
  6.   
  7. create table TABLE2   
  8. (   
  9.    ID   INTEGER,   
  10.    ROLE VARCHAR2(10)   
  11. )   
  12.   
  13. insert into TABLE1 (ID, NAME) values (1, '张三');   
  14. insert into TABLE1 (ID, NAME) values (2, '李四');   
  15. commit;   
  16.   
  17. insert into TABLE2 (ID, ROLE) values (1, '查询');   
  18. insert into TABLE2 (ID, ROLE) values (1, '分析');   
  19. insert into TABLE2 (ID, ROLE) values (1, '决策');   
  20. insert into TABLE2 (ID, ROLE) values (2, '查询');   
  21. commit;  
create table TABLE1
(
ID   INTEGER,
NAME VARCHAR2(10)
)
create table TABLE2
(
ID   INTEGER,
ROLE VARCHAR2(10)
)
insert into TABLE1 (ID, NAME) values (1, '张三');
insert into TABLE1 (ID, NAME) values (2, '李四');
commit;
insert into TABLE2 (ID, ROLE) values (1, '查询');
insert into TABLE2 (ID, ROLE) values (1, '分析');
insert into TABLE2 (ID, ROLE) values (1, '决策');
insert into TABLE2 (ID, ROLE) values (2, '查询');
commit;

 

要求输出结果:

Sql代码
  1. ID  NAME     ROLE   
  2. 1     张三 查询,分析,决策   
  3. 2     李四 查询  
ID NAME ROLE
1  张三 查询,分析,决策
2  李四 查询

 

 

方法一、使用wmsys.wm_concat

Sql代码
  1. select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id   
  2. group by table1.id,table1.name  
select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id
group by table1.id,table1.name

 

方法二、使用sys_connect_by_path

Sql代码
  1. select id, name, ltrim(max(sys_connect_by_path(role, ',')), ',') from   
  2. (select row_number() over(partition by table1.id order by name) rn,table1.*, role from table1, table2  where table1.id =   
  3.   
  4. table2.id)   
  5. start with rn = 1   
  6. connect by prior rn = rn - 1 and prior id = id   
  7. group by id, name  
  8. order by id   
  9.          
select id, name, ltrim(max(sys_connect_by_path(role, ',')), ',') from
(select row_number() over(partition by table1.id order by name) rn,table1.*, role from table1, table2  where table1.id =
table2.id)
start with rn = 1
connect by prior rn = rn - 1 and prior id = id
group by id, name
order by id

 

方法三、使用自定义函数

Sql代码
  1. create or replace function my_concat(mid in integer) return varchar2       --记住:参数和返回值里的数据类型都不用定义长度   
  2. is  
  3. result varchar2(4000);    --定义变量,记住Oracle中定义变量不需要   
  4. begin  
  5.        for temp_cursor in (select role from table2 where id=mid) loop     --此处在游标FOR循环中使用查询   
  6.             result :=result || temp_cursor.role || ',';    --Oracle中字符连接使用||,而sql server中用+          
  7.        end loop;   
  8.         result := rtrim(result,',');  --去掉最后一个空格,还有Oracle中的赋值前面没有set   
  9.        return result;   
  10. end;   
  11.   
  12. select table1.*,my_concat(table1.id) from table1,table2 where table1.id=table2.id   
  13. group by table1.id,table1.name  
  14. order by table1.id  

            原文:http://hi.baidu.com/graceyan/blog/item/6cc3a935e89f748ca71e120f.html

分享到:
评论

相关推荐

    通过SQL语句实现行列转换的几种方法

    ### 通过SQL语句实现行列转换的几种方法 在日常工作中,我们经常需要处理的数据结构并不总是按照我们期望的方式组织的。特别是在制作自定义报表或进行产品开发时,经常会遇到需要将数据从一种布局转换到另一种布局...

    sql server 行列转换

    本次提供的示例是通过动态SQL来实现行列转换的功能。下面我们将详细解析这段代码: 1. **创建测试表**: ```sql CREATE TABLE test (name CHAR(10), km CHAR(10), cj INT) GO INSERT test VALUES ('', '', 80) ...

    oracle行列转换例子

    本文将深入解析一个Oracle行列转换的例子,通过详细解释SQL语句的构成及其背后的逻辑,帮助读者理解如何在Oracle中实现行列转换。 ### Oracle行列转换例子解析 #### SQL语句结构分析 给定的SQL语句主要分为几个...

    oracle行列转换总结

    本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...

    oracle sql 行列转换

    下面,我们将详细解析如何在Oracle SQL中实现行列转换,并通过具体示例来加深理解。 ### Oracle SQL中的行列转换方法 #### 1. 使用CASE语句 CASE语句是Oracle SQL中实现条件判断的一种方式,它可以根据不同的条件...

    Oracle行列转换

    除了`PIVOT`和`UNPIVOT`,我们还可以利用`CASE`语句和`GROUP BY`来实现行列转换。例如,可以使用`CASE`语句结合`GROUP BY`来模拟`PIVOT`的功能。这种方法更为灵活,但可能需要更复杂的SQL代码。 在实际应用中,可能...

    一道java面试题 行列转换

    本篇文章将通过一个具体的Java面试题目,详细介绍如何在Oracle和SQL Server两种数据库环境下实现行列转换,并给出具体的示例代码。 #### 二、需求分析与设计 假设我们有一个成绩表`sc`,表结构如下: - `sid`: ...

    MSSQL行列转换存储过程

    本文将深入解析MSSQL中实现行列转换的存储过程及其工作原理,帮助读者理解和掌握这一关键技术。 ### MSSQL行列转换存储过程 存储过程是SQL Server中预编译的一系列SQL语句集合,用于执行特定的数据库操作,如数据...

    行列转,换行列转换

    2. **PIVOT 函数**:部分数据库系统支持PIVOT函数,可以直接实现行列转换。 3. **DECODE 函数**:类似于CASE WHEN,但使用更为简洁。 4. **子查询与联接**:通过多次查询和联接操作,间接实现行列转换。 #### 四、...

    Oracle实现行列转换的方法分析

    本文将深入探讨Oracle中实现行列转换的几种方法。 首先,对于固定列数的行列转换,假设我们有一个学生成绩表,其中包含学生姓名、科目和分数。如果要将每个学生的各科成绩从多行展示转变为一行展示,可以使用Oracle...

    sql查询中行列转换

    本篇文章将详细解释如何通过一条SQL查询语句实现行列转换,并且会针对两种不同的SQL Server版本(SQL Server 2000和SQL Server 2005)来探讨具体的实现方法。 ### 数据准备 首先,我们需要构建一个简单的数据表...

    C#中DataTable实现行列转换的方法

    接下来,我们通过`GetCrossTable()`方法实现行列转换。这个方法接收一个DataTable作为参数,将其转换成交叉表,即将原本的“姓名”作为行标识,原来的“科目”转换为列名,对应的“分数”作为新表格的值。如果某个...

    oracle行列转换

    下面将详细探讨在Oracle中实现行列转换的两种常见方法:使用DECODE函数的聚合查询和使用UNION操作符。 ### 一、使用DECODE函数的聚合查询 这种方法主要利用Oracle的DECODE函数,通过条件判断将特定的行值映射到...

    excel行列转换如何实现.docx

    以下将详细讲解如何在Excel中实现行列转换的方法。 首先,启动Excel 2021或其他版本的Excel,例如Excel 2019、Excel 2016等。在实际操作中,步骤基本相同,主要的区别可能在于界面布局或功能位置的细微差异。在本文...

    SQL 数据行列转换

    `FOR XML PATH()`函数是SQL Server提供的一种非常强大的工具,它可以用来生成XML格式的数据,同时也可以用于实现行列转换的目的。这个函数可以接受一个字符串作为参数,该参数将被用作生成XML文档中元素的名称。通过...

    数据库实现行列转换(mysql示例)

    不过,MySQL提供了其他方法来实现行列转换。本文将通过两个示例讲解如何在MySQL中进行行列转换。 **示例一:使用CASE语句** 在MySQL中,可以利用`CASE`语句配合`SUM`或`GROUP BY`来实现行列转换。这种方法适用于...

    vue实现行列转换的一种方法

    下面,我们将详细探讨如何使用Vue实现行列转换。 首先,我们需要注意的是,模板设计在Vue中的重要性。模板是Vue中用来描述页面结构的基础。在我们的案例中,作者展示了如何设计一个表格模板,该模板能够通过Vue的...

Global site tag (gtag.js) - Google Analytics