`
fspwp
  • 浏览: 48794 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

[转]将查询结果中同一字段多行合并到一行上的SQL语句写法

 
阅读更多

在开发过程中经常碰到要实现按照某一字段,将其它字段中不同的值连接后显示到一行上的需求。本人总结了以下几种方法,在实际开发中可以参考。

建立表结构,在Oracle9i上。
CREATE TABLE temp
(
DEPTNO   int,
ENAME   varchar(20 BYTE),
SEX   varchar(20 BYTE),
AGE   varchar(20 BYTE)
);

insert into temp values(10,'aaa','F','18');
insert into temp values(10,'bbb','F','19');
insert into temp values(10,'ccc','F','20');
insert into temp values(20,'ddd','M','21');
insert into temp values(20,'eee','M','22');
insert into temp values(20,'fff','M','23');
insert into temp values(30,'hhh','X','24');
insert into temp values(30,'ggg','X','25');
insert into temp values(30,'yyy','X','26');
insert into temp values(30,'ttt','X','27');

commit;

第一种写法:

SELECT DISTINCT FIRST_VALUE (deptno) OVER (PARTITION BY deptno ORDER BY lv DESC) AS deptno,
                FIRST_VALUE (ename) OVER (PARTITION BY deptno ORDER BY lv DESC) AS ename
           FROM (SELECT deptno, SYS_CONNECT_BY_PATH (ename, ' ') ename,
                            LEVEL lv FROM (SELECT deptno, ename,
                                    LAG (ename, 1, NULL) OVER (PARTITION BY deptno ORDER BY ename) ename_1
                               FROM (SELECT deptno, ename FROM temp))
                 CONNECT BY PRIOR ename = ename_1
                   ORDER BY deptno)

结果如下:

10| aaa bbb ccc
20| ddd eee fff
30| ggg hhh ttt yyy

改进后可以增加一列如下:

SELECT DISTINCT FIRST_VALUE (deptno) OVER (PARTITION BY deptno ORDER BY lv DESC) AS deptno,
                FIRST_VALUE (sex) OVER (PARTITION BY sex ORDER BY lv DESC) AS sex,
                FIRST_VALUE (ename) OVER (PARTITION BY deptno ORDER BY lv DESC) AS ename
           FROM (SELECT deptno, sex, SYS_CONNECT_BY_PATH (ename, ' ') ename, LEVEL lv
                       FROM (SELECT deptno, ename, sex,
                                    LAG (ename, 1, NULL) OVER (PARTITION BY deptno ORDER BY ename) ename_1
                               FROM (SELECT deptno, ename, sex FROM temp))
                 CONNECT BY PRIOR ename = ename_1
                   ORDER BY deptno)

结果如下:
10|F| aaa bbb ccc
20|M| ddd eee fff
30|X| ggg hhh ttt yyy

第二种写法:

SELECT deptno, SYS_CONNECT_BY_PATH (ename, ' ') AS ename, sex,
           SYS_CONNECT_BY_PATH (age, ' ') AS age
      FROM (SELECT deptno, ename, sex, age, RANK () OVER (ORDER BY deptno)
                   + ROW_NUMBER () OVER (ORDER BY deptno) rn,
                   ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptno) rm
              FROM temp) a1
     WHERE a1.ROWID IN (SELECT MAX (a2.ROWID) FROM temp a2 WHERE a2.deptno = a1.deptno)
START WITH rm = 1
CONNECT BY PRIOR rn = rn - 1

结果如下:
10| aaa bbb ccc|F| 18 19 20
20| ddd eee fff|M| 21 22 23
30| hhh ggg yyy ttt|X| 24 25 26 27

 

出自:http://hi.baidu.com/rel_conquer/blog/item/fb3bb6f3a7a5185d352acc08.html

 

 

 

Oracle中SYS_CONNECT_BY_PATH函数是非常重要的函数,下面就为您介绍一个使用SYS_CONNECT_BY_PATH函数的例子,实例如下:

  1. create table test (a varchar2(10),b varchar2(10));  
  2.  
  3. INSERT INTO TEST (A, B) VALUES ('1', '我');  
  4. INSERT INTO TEST (A, B) VALUES ('1', '们');  
  5. INSERT INTO TEST (A, B) VALUES ('2', '一');  
  6. INSERT INTO TEST (A, B) VALUES ('2', '起');  
  7. COMMIT;  
  8.  
  9. SELECT A, B FROM TEST  
  10.  
  11. A          B  
  12. ---------- ----------  
  13. 1          我  
  14. 1          们  
  15. 2          一  
  16. 2          起  
  17.  
  18. 现在需要达到如下的效果,  
  19. A          B  
  20. ---------- ----------  
  21. 1          我,们  
  22. 2          一,起  
  23.  

只想用一句sql来返回结果。

  1. SELECT A, LTRIM(MAX(SYS_CONNECT_BY_PATH(B, ',')), ',') B  
  2. FROM (SELECT B, A, ROW_NUMBER() OVER(PARTITION BY A ORDER BY B DESC) RN  
  3.           FROM TEST)  
  4. START WITH  RN  =  1  
  5. CONNECT BY RN -  1  =  PRIOR  RN  
  6.        AND  A  =  PRIOR  A  
  7. GROUP BY A; 

其中,SYS_CONNECT_BY_PATH函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示。

row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。生产序号的方法通过over()函数里面的语句来控制。

分享到:
评论

相关推荐

    PB脚本中SQL语句写法与SQL中语句写法对照

    PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...

    泛微系统SQL语句大全

    综上所述,"泛微系统SQL语句大全"是一份宝贵的资源,它包含了构建、管理和优化泛微系统所需的各种SQL技巧和实例。无论你是系统管理员、开发人员还是数据分析者,都能从中受益,提升你在泛微系统中的工作效率和数据...

    Excel VBA SQL 语句 范例

    该资源提供了两个实例,第一个实例展示了如何使用 SQL 语句从 Excel 文件中提取数据,并将结果复制到另一个工作表中。第二个实例展示了如何使用条件格式来标记不相同的行记录。 第一个实例:使用 SQL 语句提取数据 ...

    SQL实现两张无关联表的数据列合并在一张结果集中

    题目中的描述指出,需要将两张无关联表中的数据列合并到一个结果集中。这里提到的“无关联表”意味着这两张表之间没有直接的关联字段或键值,因此不能直接通过JOIN等常规方式来实现数据的联接。为了完成这个任务,...

    SQL 执行超长语句

    超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...

    mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法

    以下是一些常见的SQL语句写法来实现这一目标。 1. **LEFT OUTER JOIN** 方法: ```sql UPDATE file_manager_folder f1 LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54 ...

    SQL SERVER 表与表之间 字段一对多sql语句写法

    这个SQL语句的工作原理是,对于A表中的每一行,它都会执行四个子查询,每个子查询都查找B表中B1字段等于A表相应字段(A1、A2、A3、A4)的B2字段值。这样,结果集就会展示出A表和B表关联后的信息,即每个A表记录对应...

    OA系统常用SQL语句

    综上所述,OA系统中的SQL语句广泛应用于数据的导入、更新、查询和迁移,是系统运行和维护的关键。掌握和熟练运用这些SQL语句,对于优化OA系统的性能、提高工作效率具有重要意义。同时,理解和编写这类脚本也是IT人员...

    mysql中获取一天、一周、一月时间数据的各种sql语句写法

    这篇内容主要探讨了如何使用SQL语句获取一天、一周、一月内的数据。首先,我们创建了一个名为`t`的表,包含`id`和`addTime`两个字段,`addTime`字段存储的是日期时间类型,默认值为'0000-00-00 00:00:00'。然后,...

    sql语句生成工具,insert,update

    SQL语句是数据库操作的核心,主要用于插入(INSERT)、更新(UPDATE)和查询数据。在数据库管理系统中,这些操作是日常开发和维护中的基本任务。本文将深入探讨如何使用SQL语句生成工具,特别是针对INSERT和UPDATE...

    动态拼接sql语句.rar

    动态拼接SQL语句在IT行业中是一个常见的编程实践,尤其在数据库操作中,它允许根据程序运行时的条件或变量来构建SQL查询。这一技术在处理复杂查询逻辑、灵活的数据筛选以及减少代码冗余等方面具有显著的优势。然而,...

    MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结

    在MySQL数据库管理中,熟练掌握建表、修改字段、添加字段和创建索引的SQL语句是至关重要的。以下是对这些操作的详细说明: 1. **建表**: 使用`CREATE TABLE`语句来创建新的数据库表。例如,创建一个名为`bulletin...

    经典Excel_VBA_SQL语句

    - 将查询结果复制到`sheet2`中的A5单元格开始的位置。 - **关键点分析**: - `CONN.Open`:使用Microsoft Jet数据库引擎打开数据库连接,这里指定了Excel 8.0的数据源路径。 - SQL语句使用了`WHERE`子句来限定...

    SQL语句练习提高

    【SQL语句练习提高】 在SQL中,查询和操作数据是其核心功能。以下通过给出的练习题目,我们将深入理解SQL的基本句式和用法。 28. 题目要求从`employee`表中抽取部门名称(depart_name),计算平均工资(avg(wage)...

    SQL语句的优化在提高数据查询中的应用

    ### SQL语句优化在提升数据查询效率中的关键作用 在当今数据驱动的业务环境中,数据库的性能直接影响到企业的运营效率和服务质量。其中,SQL(Structured Query Language)作为数据库查询的标准语言,其语句的优化...

    DB2常用SQL写法

    `VALUES`关键字则可以用于求表达式的值或者创建临时行集,如将数字、字符串或者表达式的结果转化为一行或多行。 DB2还允许一些独特的SQL写法,例如,`AnyOneTable`表示任意一个存在的表,这在某些特定情况下非常...

    Ibatis常用sql语句

    这段代码定义了一个插入语句,将`MemberAccessLog`模型对象的所有字段插入到`MemberAccessLog`表中。`#accessLogId#`, `#memberId#`等为动态参数,它们会被替换为实际的值。 #### 3. 查询操作:统计成员特定时间段...

Global site tag (gtag.js) - Google Analytics