构建测试表:
-
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;
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;
要求输出结果:
- ID NAME ROLE
- 1 张三 查询,分析,决策
- 2 李四 查询
ID NAME ROLE
1 张三 查询,分析,决策
2 李四 查询
方法一、使用wmsys.wm_concat
-
select table1.*,wmsys.wm_concat(role) from table1,table2 where table1.id=table2.id
-
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
-
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
-
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
方法三、使用自定义函数
-
create or replace function my_concat(mid in integer) return varchar2
-
is
- result varchar2(4000);
-
begin
- for temp_cursor in (select role from table2 where id=mid) loop
- result :=result || temp_cursor.role || ',';
- end loop;
- result := rtrim(result,',');
- return result;
-
end;
-
-
select table1.*,my_concat(table1.id) from table1,table2 where table1.id=table2.id
-
group by table1.id,table1.name
-
order by table1.id
原文:http://hi.baidu.com/graceyan/blog/item/6cc3a935e89f748ca71e120f.html
分享到:
相关推荐
### 通过SQL语句实现行列转换的几种方法 在日常工作中,我们经常需要处理的数据结构并不总是按照我们期望的方式组织的。特别是在制作自定义报表或进行产品开发时,经常会遇到需要将数据从一种布局转换到另一种布局...
本次提供的示例是通过动态SQL来实现行列转换的功能。下面我们将详细解析这段代码: 1. **创建测试表**: ```sql CREATE TABLE test (name CHAR(10), km CHAR(10), cj INT) GO INSERT test VALUES ('', '', 80) ...
本文将深入解析一个Oracle行列转换的例子,通过详细解释SQL语句的构成及其背后的逻辑,帮助读者理解如何在Oracle中实现行列转换。 ### Oracle行列转换例子解析 #### SQL语句结构分析 给定的SQL语句主要分为几个...
本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...
下面,我们将详细解析如何在Oracle SQL中实现行列转换,并通过具体示例来加深理解。 ### Oracle SQL中的行列转换方法 #### 1. 使用CASE语句 CASE语句是Oracle SQL中实现条件判断的一种方式,它可以根据不同的条件...
除了`PIVOT`和`UNPIVOT`,我们还可以利用`CASE`语句和`GROUP BY`来实现行列转换。例如,可以使用`CASE`语句结合`GROUP BY`来模拟`PIVOT`的功能。这种方法更为灵活,但可能需要更复杂的SQL代码。 在实际应用中,可能...
本篇文章将通过一个具体的Java面试题目,详细介绍如何在Oracle和SQL Server两种数据库环境下实现行列转换,并给出具体的示例代码。 #### 二、需求分析与设计 假设我们有一个成绩表`sc`,表结构如下: - `sid`: ...
本文将深入解析MSSQL中实现行列转换的存储过程及其工作原理,帮助读者理解和掌握这一关键技术。 ### MSSQL行列转换存储过程 存储过程是SQL Server中预编译的一系列SQL语句集合,用于执行特定的数据库操作,如数据...
2. **PIVOT 函数**:部分数据库系统支持PIVOT函数,可以直接实现行列转换。 3. **DECODE 函数**:类似于CASE WHEN,但使用更为简洁。 4. **子查询与联接**:通过多次查询和联接操作,间接实现行列转换。 #### 四、...
本文将深入探讨Oracle中实现行列转换的几种方法。 首先,对于固定列数的行列转换,假设我们有一个学生成绩表,其中包含学生姓名、科目和分数。如果要将每个学生的各科成绩从多行展示转变为一行展示,可以使用Oracle...
本篇文章将详细解释如何通过一条SQL查询语句实现行列转换,并且会针对两种不同的SQL Server版本(SQL Server 2000和SQL Server 2005)来探讨具体的实现方法。 ### 数据准备 首先,我们需要构建一个简单的数据表...
接下来,我们通过`GetCrossTable()`方法实现行列转换。这个方法接收一个DataTable作为参数,将其转换成交叉表,即将原本的“姓名”作为行标识,原来的“科目”转换为列名,对应的“分数”作为新表格的值。如果某个...
下面将详细探讨在Oracle中实现行列转换的两种常见方法:使用DECODE函数的聚合查询和使用UNION操作符。 ### 一、使用DECODE函数的聚合查询 这种方法主要利用Oracle的DECODE函数,通过条件判断将特定的行值映射到...
以下将详细讲解如何在Excel中实现行列转换的方法。 首先,启动Excel 2021或其他版本的Excel,例如Excel 2019、Excel 2016等。在实际操作中,步骤基本相同,主要的区别可能在于界面布局或功能位置的细微差异。在本文...
`FOR XML PATH()`函数是SQL Server提供的一种非常强大的工具,它可以用来生成XML格式的数据,同时也可以用于实现行列转换的目的。这个函数可以接受一个字符串作为参数,该参数将被用作生成XML文档中元素的名称。通过...
不过,MySQL提供了其他方法来实现行列转换。本文将通过两个示例讲解如何在MySQL中进行行列转换。 **示例一:使用CASE语句** 在MySQL中,可以利用`CASE`语句配合`SUM`或`GROUP BY`来实现行列转换。这种方法适用于...
下面,我们将详细探讨如何使用Vue实现行列转换。 首先,我们需要注意的是,模板设计在Vue中的重要性。模板是Vue中用来描述页面结构的基础。在我们的案例中,作者展示了如何设计一个表格模板,该模板能够通过Vue的...