`
fspwp
  • 浏览: 47752 次
  • 性别: 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

分享到:
评论

相关推荐

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

    主要介绍了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法,总结分析了MySQL建表、编码设置、字段添加、索引操作所涉及的SQL语句,需要的朋友可以参考下

    泛微系统SQL语句大全

    泛微系统中常见的主要基于SQL server相关的SQL语句大全, 其中包括组织架构相关SQL,流程相关SQL以及其他自定义需求; 效率排名,等SQL总数将近百;

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

    主要介绍了SQL SERVER 表与表之间 字段一对多sql语句写法,需要的朋友可以参考下

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

    需求:把一个表某个字段内容复制到另一张表的某个字段。 实现sql语句1: 代码如下:UPDATE file_manager_folder f1LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54SET f1.parentId...

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

    sql语句 有一个非常长的sql,用编辑器打开编写的时候太长了导致编写非常吃力,而且容易错乱,我想做的是把A,B,C三个变量赋值到sql中的字段中去 A=1 B=2 C=3 sql = "update student t set t.name = '',t.sex = '',t....

    fire bird常用sql语句

    fire bird常用sql语句 一、分页写法小例: 二、显示表名和表结构 三、使用ISQL连接数据库 四、更新字段注释 五、显示字段注释 六、更新表注释 七、查询所有的表和视图(包括系统表和系统视图) 八、查询所有的用户表...

    LECCO SQL Expert (智能自动SQL优化)

    图1 人工智能自动SQL优化示意图 其核心模块之一“SQL语法优化器”的工作原理大致如下(如图1): 一条源SQL语句输入→“人工智能反馈式搜索引擎”对输入的SQL语句结合检测到的数据库结构和索引进行重写,产生N条等效...

    高效SQL语句必杀技

    那么如何才能称得上高效的SQL语句呢?一是查询优化器为当前的SQL语句生成佳的执行计划,保证数据读写使用佳路径;二是设置合理的物理存储结构,如表的类型,字段的顺序,字段的数据类型等。本文主要描述如何编写高效...

    oracle查表字段

    下面为您介绍的是查询表的字段名的sql语句写法,sql语句可以实现许多的功能,希望可以您在学习sql语句使用方面获得启示。 1. select name from syscolumns where id = (select id from sysobjects where type = 'u' ...

    lecco sql export pro(SQL优化器)

    图6 源语句与SQL124的比较 以上面优化的结果为例,为了查看源SQL语句和SQL124在写法上的不同,我们可以按下“比较器”按钮,对SQL124和源SQL语句进行比较。如果选择“双向比较”复选框,“SQL比较器”可以将两条...

    codemirror支持中文数据库模式表字段SQL自动代码提示

    codemirror的sql代码提示默认是不支持中文表名自动提示的,在源码中写法只是检索字母数字下划线,加上中文匹配的正则后,终于支持中文表了。修改文件只有sql.js,其他文件只是为了方便打断点,格式化了一下方法

    一个常用的报表统计SQL语句

    下面给出上图的例子的sql语句写法:(注:此处是按“日期”字段统计) 代码如下: select 日期,自选字段1,自选字段2,sum(类型1) 类型1,sum(类型2) 类型2,sum(类型3) 类型3,sum(类型4) 类型4,sum(类型5) 类型5,sum(类型6...

    Oracle在Mybatis中SQL语句的配置方法

    1.XML文件中SQL语句配置(Geteway.xml文件) <?xml version=1.0 encoding=UTF-8?> <!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd> ...

    SqlServer常用的几种分页查询SQL语句介绍、对比以及在.Net下的使用

    前言  在实际开发过程中,当数据量比较多的时候,大量的数据一下子展示到页面上是非常不可取的。所以我们通常要进行分页(这里的分页是指真分页),而不是前端JS...一、三种分页SQL语句的介绍和写法  示例数据库的字段:  

    SQL语句从入门到精通迅速提升篇视频课程(Oracle零基础版)

    这是一套体系化的SQL语句教程,按照从浅入深的模式讲解工作中常用的SQL写法、函数、字段处理技术等。使大家快速掌握SQL的基础及部分高阶知识,进而熟练的对数据库表、字段进行各种查询、创建、更新、删除操作。  ...

Global site tag (gtag.js) - Google Analytics