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

[转]多行字段合并到一行上的SQL语句写法

 
阅读更多
多行字段合并到一行上的SQL语句写法
2011-04-06 22:24

------------------------------多行字段合并到一行上的SQL语句写法----------------------------------
在开发过程中经常碰到要实现按照某一字段,将其它字段中不同的值连接后显示到一行上的需求。
本人总结了一下两种方法:

CREATE TABLE dept(DEPTID int,ENAME varchar(20 BYTE),SEX varchar(20 BYTE),AGE varchar(20 BYTE));

insert into dept values(1,'张三','F','18');
insert into dept values(1,'李四','F','19');
insert into dept values(1,'王五','F','20');
insert into dept values(2,'刘六','M','21');
insert into dept values(2,'赵七','M','22');
insert into dept values(2,'曹九','M','23');

commit;

select * from dept

--第一种写法:
SELECT DISTINCT FIRST_VALUE(deptid) OVER(PARTITION BY deptid ORDER BY lv DESC) AS deptid,
FIRST_VALUE(ename) OVER(PARTITION BY deptid ORDER BY lv DESC) AS ename
FROM (SELECT deptid, SYS_CONNECT_BY_PATH(ename, ' ') ename, LEVEL lv
FROM (SELECT deptid,ename,LAG(ename, 1, NULL) OVER(PARTITION BY deptid ORDER BY ename) ename_1
FROM (SELECT deptid, ename FROM dept))
CONNECT BY PRIOR ename = ename_1
ORDER BY deptid, ename)
--Oracle中sys_connect_by_path函数用法:主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示
--其中connect by是oracle中一种特有按层次递归用法,PRIOR表示上一条记录,CONNECT BY PRIOR ename=ename_1是说上一条记录的ename是本条记录的ename_1,即本记录的父亲是上一条记录。
--level是一个伪列

--结果如下:
--1 | 李四 王五 张三
--2 | 曹九 刘六 赵七

--改进后可以增加一列如下:
SELECT DISTINCT FIRST_VALUE (deptid) OVER (PARTITION BY deptid ORDER BY lv DESC) AS deptid,
FIRST_VALUE (sex) OVER (PARTITION BY sex ORDER BY lv DESC) AS sex,
FIRST_VALUE (ename) OVER (PARTITION BY deptid ORDER BY lv DESC) AS ename
FROM (SELECT deptid, sex, SYS_CONNECT_BY_PATH (ename, ' ') ename, LEVEL lv
FROM (SELECT deptid, ename, sex,
LAG (ename, 1, NULL) OVER (PARTITION BY deptid ORDER BY ename) ename_1
FROM (SELECT deptid, ename, sex FROM dept))
CONNECT BY PRIOR ename = ename_1
ORDER BY deptid)

--结果如下:
--1 |F | 李四 王五 张三
--2 |M | 曹九 刘六 赵七

--第二种写法:

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

--结果如下:
--1| 张三 李四 王五|F| 18 19 20
--2| 刘六 赵七 曹九|M| 21 22 23

分享到:
评论

相关推荐

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

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

    泛微系统SQL语句大全

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

    Excel VBA SQL 语句 范例

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

    SQL 执行超长语句

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

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

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

    sql语句生成工具,insert,update

    这可能是SQL语句生成工具的可执行文件,运行这个程序可以在本地计算机上生成SQL代码。此类应用程序通常包含交互式界面,用户可以通过它连接到数据库,选择表,然后生成所需的INSERT和UPDATE语句。 5. "DataBase....

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

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

    OA系统常用SQL语句

    例如,"批复意见回填表单.doc"和"将处理人姓名与处理时间回填表单字段.doc"可能涉及到对审批流程记录的管理,通过SQL语句更新这些记录,确保流程的完整追踪。 3. **日常办公**:日常工作中,如文档权限管理是常见的...

    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语句写法总结

    以下是对MySQL常用建表、添加字段、修改字段和添加索引的SQL语句的详细说明: 1. **建表**: - `DROP TABLE IF EXISTS bulletin;`:如果存在名为`bulletin`的表,则先删除。 - `CREATE TABLE bulletin(`...`)`: ...

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

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

    动态拼接sql语句.rar

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

    SQL语句练习提高

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

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

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

    DB2常用SQL写法

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

    Sql语句优化(很好的资料)

    SQL语句优化是提高软件系统效率的关键技术,尤其是在大数据量的场景下,高效的SQL能够显著提升数据库查询速度,降低系统资源消耗。以下是一些关于SQL优化的重要知识点: 1. **IN操作符**: - 使用IN操作符虽然使得...

    SQL语句的性能优化浅析.pdf

    SQLtrace工具是收集SQL性能状态数据的重要工具,它可以记录执行中的SQL语句的性能数据到跟踪文件中。这些数据包括解析次数、执行次数、CPU使用时间等,为SQL语句优化提供了重要的参考。为了启用SQLtrace,需要在init...

Global site tag (gtag.js) - Google Analytics