- 浏览: 65133 次
- 性别:
- 来自: 珠海
文章分类
最新评论
在开发过程中经常碰到要实现按照某一字段,将其它字段中不同的值连接后显示到一行上的需求。本人总结了以下几种方法,在实际开发中可以参考。
建立表结构,在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
建立表结构,在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
发表评论
-
数据库创建链接远程服务器
2014-05-09 11:59 723--PKselect * from sys.key_con ... -
SQL作业的操作大全
2013-03-21 16:00 903SQL作业的操作全 --定义创建作业DECLARE @ ... -
Oracle创建删除用户、角色、表空间、导入导出..命令总结
2012-12-11 14:18 927//创建临时表空间 create temporary ta ... -
sql 查询出每个科目成绩第一的学生信息
2012-07-10 09:10 5562一次性查询出每个科目的成绩第一的学生,在SQL SERVE ... -
用SQL语句添加删除修改字段等操作
2012-05-28 14:10 2158用SQL语句添加删除修改字段1.增加字段 alter ... -
SQL中 patindex函数的用法
2012-03-13 11:12 1136语法格式:PATINDEX ( '%pattern%' , e ... -
查询DB2多行数据一行显示(精简sql)
2012-02-21 09:45 1801select o1.ORGTYPE,varchar(repla ... -
SQL+Assistant+v4.8&2Bkey
2011-10-25 09:09 820SQL+Assistant+v4.8&2Bkey -
ROW_NUMBER、RANK、DENSE_RANK的用法
2011-10-19 08:39 861ROW_NUMBER、RANK、DENSE_RANK的用法 ... -
用 SQL 语句查看 SQL Server 端口号
2011-09-01 11:00 4431用 SQL 语句查看 SQL Server 2005 端口号 ... -
db2中关于递归(with)的使用
2011-05-24 19:15 6343db2中关于递归(with)的使用因为有人问及,这边简单的再探 ... -
DB2常用函数与Oracle比较
2011-05-19 09:47 18431、类型转化函数:decimal, double, Inte ... -
oracle 的wmsys.wm_concat函数用法
2011-05-17 14:25 1553无意中碰到wmsys.wm_concat这个函数很好很强大. ... -
Oracle相关的1000个命令
2011-02-23 09:22 1707Oracle相关的1000个命令(实用) 比较适合初学者,所 ... -
Sql Server 常用日期格式
2011-02-19 10:31 823Sql Server 常用日期格式 SQL Server中文 ... -
SQL语句优化34条(常拿来用用)
2011-02-18 08:32 7291)选择最有效率的表名顺序(只在基于规则的优化器中有效): ... -
MS-SQL Server 多行转为一列的合并
2010-12-21 08:40 4241描述:将如下形式的数据按id字段合并value字段。 id ... -
列出一个表的字段的全部信息
2010-12-17 11:00 875select rtrim(b.name) ascolname ... -
汇总数据到一行
2010-11-15 21:17 827--sql server 2005 --执行 select ... -
SQL的行列转化问题
2010-10-21 16:04 1045SQL Server中行列转换 Pivot UnPivot ...
相关推荐
PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...
综上所述,"泛微系统SQL语句大全"是一份宝贵的资源,它包含了构建、管理和优化泛微系统所需的各种SQL技巧和实例。无论你是系统管理员、开发人员还是数据分析者,都能从中受益,提升你在泛微系统中的工作效率和数据...
该资源提供了两个实例,第一个实例展示了如何使用 SQL 语句从 Excel 文件中提取数据,并将结果复制到另一个工作表中。第二个实例展示了如何使用条件格式来标记不相同的行记录。 第一个实例:使用 SQL 语句提取数据 ...
这个SQL语句的工作原理是,对于A表中的每一行,它都会执行四个子查询,每个子查询都查找B表中B1字段等于A表相应字段(A1、A2、A3、A4)的B2字段值。这样,结果集就会展示出A表和B表关联后的信息,即每个A表记录对应...
超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...
这段SQL语句的作用是创建一个名为`tab1`的临时表,并从中选择`tb_user`表中的前四条记录(根据`Id`字段排序)。这里使用了`TOP 4`来限制返回的结果数量,而`ROW_NUMBER()`函数则为每一行分配了一个唯一的行号,作为...
以下是一些常见的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语句获取一天、一周、一月内的数据。首先,我们创建了一个名为`t`的表,包含`id`和`addTime`两个字段,`addTime`字段存储的是日期时间类型,默认值为'0000-00-00 00:00:00'。然后,...
SQL语句是数据库操作的核心,主要用于插入(INSERT)、更新(UPDATE)和查询数据。在数据库管理系统中,这些操作是日常开发和维护中的基本任务。本文将深入探讨如何使用SQL语句生成工具,特别是针对INSERT和UPDATE...
综上所述,OA系统中的SQL语句广泛应用于数据的导入、更新、查询和迁移,是系统运行和维护的关键。掌握和熟练运用这些SQL语句,对于优化OA系统的性能、提高工作效率具有重要意义。同时,理解和编写这类脚本也是IT人员...
动态拼接SQL语句在IT行业中是一个常见的编程实践,尤其在数据库操作中,它允许根据程序运行时的条件或变量来构建SQL查询。这一技术在处理复杂查询逻辑、灵活的数据筛选以及减少代码冗余等方面具有显著的优势。然而,...
在实际应用中,根据业务需求选择合适的字段类型、约束和索引类型至关重要,因为它们直接影响到数据的存储效率和查询性能。例如,主键索引确保数据的唯一性,而全文索引则加速了文本搜索。正确设置编码能确保数据的...
### SQL语句优化在提升数据查询效率中的关键作用 在当今数据驱动的业务环境中,数据库的性能直接影响到企业的运营效率和服务质量。其中,SQL(Structured Query Language)作为数据库查询的标准语言,其语句的优化...
【SQL语句练习提高】 在SQL中,查询和操作数据是其核心功能。以下通过给出的练习题目,我们将深入理解SQL的基本句式和用法。 28. 题目要求从`employee`表中抽取部门名称(depart_name),计算平均工资(avg(wage)...
`VALUES`关键字则可以用于求表达式的值或者创建临时行集,如将数字、字符串或者表达式的结果转化为一行或多行。 DB2还允许一些独特的SQL写法,例如,`AnyOneTable`表示任意一个存在的表,这在某些特定情况下非常...
根据给定的文件信息,以下是对“Ibatis常用SQL语句”的详细解析,涵盖了一系列Ibatis在数据操作中的应用实例。 ### Ibatis简介 Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让...
- SQL语句中包含了两个子查询:一个用于从“入库”表中获取数据,另一个从“回款”表中获取数据。 - 子查询的结果通过LEFT JOIN合并在一起,确保所有存货类都能出现在最终结果中。 - 条件筛选包括了区域名称、...
举一个具体的例子,假设我们需要构建一个更新学生信息的SQL语句,其中包含了多个字段和参数,我们可以将SQL语句拆分成多行,并在每一行的末尾使用加号(+)来连接下一行,或者使用括号()来实现跨行效果,然后在SQL语句...