`

查询结果中多行字段合并到一行上的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
分享到:
评论

相关推荐

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

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

    泛微系统SQL语句大全

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

    Excel VBA SQL 语句 范例

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

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

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

    SQL 执行超长语句

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

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

    这段SQL语句的作用是创建一个名为`tab1`的临时表,并从中选择`tb_user`表中的前四条记录(根据`Id`字段排序)。这里使用了`TOP 4`来限制返回的结果数量,而`ROW_NUMBER()`函数则为每一行分配了一个唯一的行号,作为...

    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 ...

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

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

    sql语句生成工具,insert,update

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

    OA系统常用SQL语句

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

    动态拼接sql语句.rar

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

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

    在实际应用中,根据业务需求选择合适的字段类型、约束和索引类型至关重要,因为它们直接影响到数据的存储效率和查询性能。例如,主键索引确保数据的唯一性,而全文索引则加速了文本搜索。正确设置编码能确保数据的...

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

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

    SQL语句练习提高

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

    DB2常用SQL写法

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

    Ibatis常用sql语句

    根据给定的文件信息,以下是对“Ibatis常用SQL语句”的详细解析,涵盖了一系列Ibatis在数据操作中的应用实例。 ### Ibatis简介 Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让...

    经典Excel_VBA_SQL语句

    - SQL语句中包含了两个子查询:一个用于从“入库”表中获取数据,另一个从“回款”表中获取数据。 - 子查询的结果通过LEFT JOIN合并在一起,确保所有存货类都能出现在最终结果中。 - 条件筛选包括了区域名称、...

    python一行sql太长折成多行并且有多个参数的方法

    举一个具体的例子,假设我们需要构建一个更新学生信息的SQL语句,其中包含了多个字段和参数,我们可以将SQL语句拆分成多行,并在每一行的末尾使用加号(+)来连接下一行,或者使用括号()来实现跨行效果,然后在SQL语句...

Global site tag (gtag.js) - Google Analytics