Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」

Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」工作中用到一段比较复杂的SQL查询脚本,使用了listagg()函数实现了具有多个值的字段的填充(即,列表聚合,listaggregation(我猜的))。说简单点,listagg()函数可以实现多列记录聚合为一条记录,从而实现数据的压缩、致密化(datadensification)。以下内容转载自http://dacoolbaby.iteye.com/blog/1698957,SQL脚本做了…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

工作中用到一段比较复杂的SQL查询脚本,使用了listagg()函数实现了具有多个值的字段的填充(即,列表聚合,list aggregation(我猜的))。

说简单点,listagg()函数可以实现多列记录聚合为一条记录,从而实现数据的压缩、致密化(data densification)。

以下内容转载自http://dacoolbaby.iteye.com/blog/1698957,SQL脚本做了部分优化,增加了输出结果。

————————————————————————-

这是一个Oracle的列转行函数:LISTAGG()

先看示例代码: 

with temp as(  
select 'China' nation ,'Guangzhou' city from dual union all  
select 'China' nation ,'Shanghai' city from dual union all  
select 'China' nation ,'Beijing' city from dual union all  
select 'USA' nation ,'New York' city from dual union all  
select 'USA' nation ,'Bostom' city from dual union all  
select 'Japan' nation ,'Tokyo' city from dual   
)  
select nation,listagg(city,',') within GROUP (order by city)  as Cities
from temp  
group by nation

运行结果:

Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」

这是最基础的用法:

LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX),

用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来,非常方便。 

同样是聚合函数,还有一个高级用法:

就是over(partition by XXX)

也就是说,在你不使用Group by语句时候,也可以使用LISTAGG函数:

with temp as(  
select 500 population, 'China' nation ,'Guangzhou' city from dual union all  
select 1500 population, 'China' nation ,'Shanghai' city from dual union all  
select 500 population, 'China' nation ,'Beijing' city from dual union all  
select 1000 population, 'USA' nation ,'New York' city from dual union all  
select 500 population, 'USA' nation ,'Bostom' city from dual union all  
select 500 population, 'Japan' nation ,'Tokyo' city from dual   
)  
select population,  
nation,  
city,  
listagg(city,',') within GROUP (order by city) over (partition by nation) rank  
from temp

运行结果:
Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」

总结:LISTAGG()把它当作SUM()函数来使用就可以了。

Oracle Database SQL Language Reference上有关listagg()函数的描述如下:

—————————————————————————————————————————–

Oracle列转行函数 Listagg() 语法详解及应用实例「建议收藏」

Purpose
For a specified measure, LISTAGG orders data within each group specified in the ORDER BY clause and then concatenates the values of the measure column.
■ As a single-set aggregate function, LISTAGG operates on all rows and returns a single output row.
■ As a group-set aggregate, the function operates on and returns an output row for each group defined by the GROUP BY clause.
■ As an analytic function, LISTAGG partitions the query result set into groups based on one or more expression in the query_partition_clause.
The arguments to the function are subject to the following rules:
■ The measure_expr can be any expression. Null values in the measure column are ignored.
■ The delimiter_expr designates the string that is to separate the measure values.
This clause is optional and defaults to NULL.
■ The order_by_clause determines the order in which the concatenated values are returned. The function is deterministic only if the ORDER BY column list achieved
unique ordering.
The return data type is RAW if the measure column is RAW; otherwise the return value is VARCHAR2.
Aggregate Examples
The following single-set aggregate example lists all of the employees in Department 30 in the hr.employees table, ordered by hire date and last name:
SELECT LISTAGG(last_name, ‘; ‘)
WITHIN GROUP (ORDER BY hire_date, last_name) “Emp_list”,
MIN(hire_date) “Earliest”
FROM employees
WHERE department_id = 30;
Emp_list Earliest
———————————————————— ———
Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares 07-DEC-02
The following group-set aggregate example lists, for each department ID in the hr.employees table, the employees in that department in order of their hire date:

SELECT department_id “Dept.”,
LISTAGG(last_name, ‘; ‘) WITHIN GROUP (ORDER BY hire_date) “Employees”
FROM employees
GROUP BY department_id
ORDER BY department_id;
Dept. Employees
—— ————————————————————
10 Whalen
20 Hartstein; Fay
30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares
40 Mavris
50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie
s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot
; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; Matos; Pat
el; Walsh; Feeney; Dellinger; McCain; Vargas; Gates; Rogers;
Mikkilineni; Landry; Cabrio; Jones; Olson; OConnell; Sulliv
an; Mourgos; Gee; Perkins; Grant; Geoni; Philtanker; Markle
60 Austin; Hunold; Pataballa; Lorentz; Ernst
70 Baer
. . .
Analytic Example
The following analytic example shows, for each employee hired earlier than September 1, 2003, the employee’s department, hire date, and all other employees in
that department also hired before September 1, 2003:
SELECT department_id “Dept”, hire_date “Date”, last_name “Name”,
LISTAGG(last_name, ‘; ‘) WITHIN GROUP (ORDER BY hire_date, last_name)
OVER (PARTITION BY department_id) as “Emp_list”
FROM employees
WHERE hire_date < ’01-SEP-2003′
ORDER BY “Dept”, “Date”, “Name”;
Dept Date Name Emp_list
—– ——— ————— ———————————————
30 07-DEC-02 Raphaely Raphaely; Khoo
30 18-MAY-03 Khoo Raphaely; Khoo
40 07-JUN-02 Mavris Mavris
50 01-MAY-03 Kaufling Kaufling; Ladwig
50 14-JUL-03 Ladwig Kaufling; Ladwig
70 07-JUN-02 Baer Baer
90 13-JAN-01 De Haan De Haan; King
90 17-JUN-03 King De Haan; King
100 16-AUG-02 Faviet Faviet; Greenberg
100 17-AUG-02 Greenberg Faviet; Greenberg
110 07-JUN-02 Gietz Gietz; Higgins
110 07-JUN-02 Higgins Gietz; Higgins


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197718.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PKI体系框架「建议收藏」

    PKI体系框架「建议收藏」  PKI是PublicKeyInfrastructure的缩写,主要功能是绑定整数持有者的身份和相关秘钥对(通过为公钥及相关的用户身份信息签发数字证书),为用户提供方便的证书申请、证书作废、证书获取、证书状态查询的途径,并且利用数字证书及相关的各种服务(证书发布、黑名单机制、时间戳服务等)实现通信中各实体的身份认证、完整性、抗抵赖性和保密性。  根据数字证书格式和密钥管理方式的不同,PK…

    2022年8月22日
    8
  • OC——Foundation—常用的类(1)字符串(NSString)

    OC——Foundation—常用的类(1)字符串(NSString)

    2021年9月5日
    59
  • 什么学习软件需要身份证验证_什么是两层身份验证,为什么我需要它?

    什么学习软件需要身份证验证_什么是两层身份验证,为什么我需要它?什么学习软件需要身份证验证Moreandmorebanks,creditcardcompanies,andevensocialmedianetworksandgamingsitesarestartingtousetwo-factorauthentication.Ifyou’realittleunclearonwhatitisoronw…

    2022年5月10日
    57
  • python解析xps文件_xps文件的基本操作

    python解析xps文件_xps文件的基本操作最近一直研究XPS文件,目前已经解决了二进制流转XPS文件、XPS文件转二进流、XPS文件的解析、XPS文件转图片、XPS文件打印等。但是一直没有找到如何向xps文件中插入图片的方法,好烦恼啊!!!!如果那位大神有向xps文件中插入图片的方法请及时联系我谢谢,QQ470163177。本人研究的成果如下,需要的码友可以学习下。注意:xps命名空间在ReachFramework.dll中using…

    2022年6月3日
    35
  • 空间解析几何

    空间解析几何解析几何是用代数方法研究几何对象之间的关系和性质的一门几何学分支 通俗讲就是通过建立坐标系来用方程描述几何图形 在解析几何创立以前 几何与代数是彼此独立的两个分支 而它的出现使形与数统一起来 这是数学发展史上的一次重大突破 在平面解析几何中 除了研究直线的有关性质外 主要是研究圆锥曲线 圆 椭圆 抛物线 双曲线 的有关性质 在空间解析几何中 除了研究平面 直线有关性质外 主要研究柱面 锥

    2025年6月30日
    5
  • 子网划分习题及考点分析(含答案及理解)

    子网划分习题及考点分析(含答案及理解)Mon21Mon28Mon04已完成进行中计划中现有任务子网划分一、选择题:1.92.168.1.0/24使用掩码255.255.255.240划分子网,其子网数为(),每个子网内可用主机地址数为()A.1414B.1614C.2546D.1462解析:(1)掩码255.255.255.240为28位,28-24=4网络位向主机位借用了4位,子网数为2的4次

    2022年6月27日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号