WMSYS.WM_CONCAT 函数的用法

 

select t.rank, t.Name from t_menu_item t;

    10 CLARK
    10 KING
    10 MILLER
    20 ADAMS
    20 FORD
    20 JONES
    20 SCOTT
    20 SMITH
    30 ALLEN
    30 BLAKE
    30 JAMES
    30 MARTIN
    30 TURNER
    30 WARD

--------------------------------
我们通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果

    select t.rank, WMSYS.WM_CONCAT(t.Name) TIME From t_menu_item t GROUP BY t.rank;

DEPTNO ENAME
------ ----------
    10 CLARK, KING, MILLER
    20 ADAMS, FORD, JONES, SCOTT, SMITH
    30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD

例子如下:

SQL> create table idtable (id number,name varchar2(30));

Table created

SQL> insert into idtable values(10,'ab');

1 row inserted

SQL> insert into idtable values(10,'bc');

1 row inserted

SQL> insert into idtable values(10,'cd');

1 row inserted

SQL> insert into idtable values(20,'hi');

1 row inserted

SQL> insert into idtable values(20,'ij');

1 row inserted
SQL> insert into idtable values(20,'mn');

1 row inserted

SQL> select * from idtable;

        ID NAME
---------- ------------------------------
        10 ab
        10 bc
        10 cd
        20 hi
        20 ij
        20 mn

6 rows selected
SQL> select id,wmsys.wm_concat(name) name from idtable
2 group by id;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab,bc,cd
        20 hi,ij,mn

SQL> select id,wmsys.wm_concat(name) over (order by id) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab,bc,cd
        10 ab,bc,cd
        10 ab,bc,cd
        20 ab,bc,cd,hi,ij,mn
        20 ab,bc,cd,hi,ij,mn
        20 ab,bc,cd,hi,ij,mn

6 rows selected

SQL> select id,wmsys.wm_concat(name) over (order by id,name) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab
        10 ab,bc
        10 ab,bc,cd
        20 ab,bc,cd,hi
        20 ab,bc,cd,hi,ij
        20 ab,bc,cd,hi,ij,mn

6 rows selected

个人觉得这个用法比较有趣.

SQL> select id,wmsys.wm_concat(name) over (partition by id) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab,bc,cd
        10 ab,bc,cd
        10 ab,bc,cd
        20 hi,ij,mn
        20 hi,ij,mn
        20 hi,ij,mn

6 rows selected

SQL> select id,wmsys.wm_concat(name) over (partition by id,name) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab
        10 bc
        10 cd
        20 hi
        20 ij
        20 mn

6 rows selected

 

ps:

wmsys.wm_concat、sys_connect_by_path、自定义行数实现行列转换:

CREATE TABLE tab_name(ID INTEGER NOT NULL PRIMARY KEY,cName VARCHAR2(20));
CREATE TABLE tab_name2(ID INTEGER NOT NULL,pName VARCHAR2(20));

INSERT INTO tab_name(ID,cName) VALUES (1,'百度');
INSERT INTO tab_name(ID,cName) VALUES (2,'Google');
INSERT INTO tab_name(ID,cName) VALUES (3,'网易');
INSERT INTO tab_name2(ID,pName) VALUES (1,'研发部');
INSERT INTO tab_name2(ID,pName) VALUES (1,'市场部');
INSERT INTO tab_name2(ID,pName) VALUES (2,'研发部');
INSERT INTO tab_name2(ID,pName) VALUES (2,'平台架构');
INSERT INTO tab_name2(ID,pName) VALUES (3,'研发部');
COMMIT;

期望结果:

ID             cName                        pName               

1                 百度                     研发部,市场部

2                 Google                 研发部

3                  网易                     研发部,平台架构

方法一:使用wmsys.wm_concat()

SELECT t1.ID,t1.cName,wmsys.wm_concat(t2.pName) FROM tab_name t1,tab_name2 t2 WHERE t1.ID=t2.ID GROUP BY t1.cName,t1.id;

方法二:使用sys_connect_by_path

select id, cName, ltrim(max(sys_connect_by_path(pName, ',')), ',') from (select row_number() over(PARTITION by t1.id ORDER by cName) r,t1.*, t2.pName from tab_name t1, tab_name2 t2 where t1.id = t2.id)
start with r=1 CONNECT by prior r =r-1 and prior id = id group by id ,cName order by id;

方法三:使用自定义函数

create or replace function coltorow(midId INT) RETURN VARCHAR2 is
Result VARCHAR2(1000);
begin
FOR cur IN (SELECT pName FROM tab_name2 t2 WHERE midId=t2.id) LOOP
RESULT:=RESULT||cur.pName||',';
END LOOP;
RESULT:=rtrim(RESULT,',');
return(Result);
end coltorow;

SELECT t1.*,coltorow(t1.ID) FROM tab_name t1,tab_name2 t2 WHERE t1.ID=t2.ID GROUP BY t1.ID,t1.cname ORDER BY t1.ID;

 
原文地址:
http://blog.sina.com.cn/s/blog_5c4736800100l2qw.html

转载于:https://www.cnblogs.com/hzz521/p/5249577.html

【Oracle】Oracle聚合函数XMLAGG详解(史上最全) Oracle聚合函数XMLAGG详解(史上最全): XMLAGG函数是Oracle数据库中一种特定的聚合函数,主要用于将多行数据转化为一个XML类型的值。通过对多个行数据的拼接,生成XML文档。该函数可以自定义XML文档的结构,实现灵活的数据拼接和文档构建。XMLAGG函数是Oracle数据库中一种强大的函数,可以用于多行数据的拼接和XML文档的构建。使用时需要注意数据的排序、空值的处理和结尾字符的删除等问题,以确保生成的文档符合要求。 阅读详情

相关推荐

PostgreSQL 行转列、列转行字符串函数、字符串分割函数

本文主要介紹PostgreSQL 的行转列、列转行以及字符串切割函数,实际业务中对前两个均有使用,并配有实际例子参考。 1、字符串列转行 string_agg,某些地方也称为字符串聚合操作。 如果需要按照一个字符串按照某个分割符拼接起来。 例如: 按照id把字符串按照指定分隔符拼接起来。实际业务中有什么需要这种字符串函数的呢? -------------------...

MyySophia的博客 4万+

ORACLE行转列、列转行实现方式及案例

在Oracle中,可以使用多种方法来实现行转列和列转行。以下是一些常用的方法: PIVOT函数:Oracle 11g之后,支持使用PIVOT实现行转列。 MAX和DECODE函数:可以使用MAX函数结合DECODE函数来实现行转列。 CASE WHEN和GROUP BY:这种方式是最常用的,比较容易理解。 UNPIVOT函数:可以利用UNPIVOT()函数实现列转行。 UNION ALL方法:也可以使用UNION ALL方法来实现列转行。

qq_43605229的博客 1万+

MATLAB编程语言的优势与不足

综上所述,MATLAB作为一种科学计算和工程开发的编程语言,具有易学易用、丰富的工具箱和强大的数值计算能力等优势。然而,它的运行速度相对较慢,闭源性和高昂的价格也是一些不足之处。3.强大的数值计算能力:MATLAB的底层实现使用了高度优化的数值计算库,因此它在处理大规模数据和复杂数学运算时非常高效。2.丰富的工具箱:MATLAB提供了大量的工具箱和函数库,涵盖了各种领域的应用,包括信号处理、图像处理、优化、控制系统等。3.高昂的价格:商业版MATLAB的价格较高,对个人用户和小型团队来说可能不太实惠。

2301_79326930的博客 1502

wmsys.wm_concat的几个用法

select t.rank, t.Name from t_menu_item t; 10 CLARK 10 KING 10 MILLER 20 ADAMS 20 FORD 20 JONES 20 SCOTT 20 SMITH 30 ALLEN 30 BLAKE 30 JAMES ...

537

oracle 多行转一列,一列转多行

有一个表,表名为tab_test,如下: 一、多行转一列 select id, vnum, to_char(wmsys.wm_concat(vname)) c from tab_test group by id,vnum; 执行上述sql后,如下:   二、一列转多行 with a as (select '/ABC/AA/AD/ABD/JI/CC/ALSKD...

杀破狼!!! 1563

Z3求解器简介及环境搭建

0、引言 Z3 是微软研究领域最先进的定理证明器。它可以用来检查逻辑公式在一个或多个理论上的可满足性。Z3为软件分析及验证工具提供了一个引人注目的匹配, 因为几个常见的软件构造直接映射到支持的理论中 1、Z3的基本架构: 在深入研究Z3的体系结构细节之前,让我们看一下Z3的体系结构,以了解它是如何执行的。Z3集成了一个SAT求解器、一个核心理论求解器(同余闭合核)、4个辅助求解计算器以及一个...

guo_shaokun的专栏 8896

MATLAB中2x2和3x3矩阵特征值的计算与应用

特征值是反映线性变换对向量影响程度的一个重要数学概念。对于矩阵A,如果存在非零向量x和标量λ,使得Ax=λx成立,那么λ就被称为矩阵A的一个特征值,而对应的非零向量x称为对应的特征向量。

weixin_28850145的博客 836

x^1 + x ^2 +...+x ^n = m 求x

一、问题描述x+x^1+x^2+…x^12 = 100,求 x二、公式求解x^1 + x ^2 +…+x ^n = m x^2 + x ^3 +…+x ^(n+1) = mx 两边同时乘 x,相减x - x ^(n + 1) = m - mx (x - x ^(n + 1) ) /(1 - x) = m这个方程没有精确解,只有近似解。关于各种变换,然后手工求解,至少得过了高数6级,抱歉我没过

微寒的技术博客 2369

c语言二分法求方程最小值,C语言在区间[0,1]内用二分法求方程e^x+10x-2=0的近似根,误差不超过0.5*10^(-3),帮忙看一下错误怎么改?...

C语言在区间[0,1]内用二分法求方程e^x+10x-2=0的近似根,误差不超过0.5*10^(-3),帮忙看一下错误怎么改?关注:201答案:6mip版解决时间 2021-01-12 12:48提问者拿什么谈未来2021-01-12 00:00#include#include#include#includefloat getvalue(float x){return e^x+10x-2;...

weixin_42299728的博客 2387

Visual Basic实现一元三次方程求解

一元三次方程是数学中一个重要的方程类型,其一般形式为,其中a ≠ 0。它在代数学、工程学、物理学等多个领域中都有广泛的应用。解决这类方程的根问题不仅是基础数学问题,也是计算机科学领域算法设计的基础,对于理解数值分析和编程解决实际问题具有重要意义。在开发一元三次方程求解器项目的过程中,我们积累了宝贵的经验,并且在解决问题的过程中也形成了许多最佳实践。

weixin_30674431的博客 1195

python用二分法求方程在区间上的根_设计一个用二分法求方程x3-x4+4x2-1=0在区间[0,1]上的一个实根。 ---- 第五章 选择分支与循环 答案 新编Visual Basic程序设计教程...

13.设计一个用二分法求方程x3-x4+4x2-1=0在区间[0,1]上的一个实根。解,在窗体上建一个按钮,再建一个文本框,文本框用于输出方程的解。此题VB代码如下:Private Sub Command1_Click()Dim a As Single, b As Single, c As Single, fa As Single, fb As Single, fc As SingleDoa = ...

weixin_39714565的博客 1075

matlab 画sin波形,用matlab画函数y=sin(paix)+x^2 x在区间[-2,2]的波形图?

x=0:pi/100:4*pi;y1=sin(2*x);y2=cos(2*x);plot(x,y1,x,y2)hold ona=solve('sin(2*x)=cos(2*x)');a=eval(a);x0=a+[0:7]*pi/2;y0=sin(2*x0);plot(x0,y0,'r+')legend('sin(2x)','cos(2x)'),二倍4102角公式sin(2x)=2sinxcosx...

weixin_28900463的博客 1957

Z3约束求解器在逆向工程中的应用:从CTF解题到软件分析

约束求解是程序分析与形式化验证领域的核心技术,其本质是将程序执行路径上的条件判断抽象为数学方程或逻辑约束,通过自动化求解寻找满足所有条件的输入。基于可满足性模理论(SMT),这类技术能够精确模拟位向量运算、布尔逻辑及内存操作,有效解决传统手工逆向中面临的路径爆炸与复杂约束问题。在工程实践中,约束求解显著提升了逆向分析效率,尤其适用于序列号破解、算法还原及漏洞模式挖掘等场景。本文以Z3求解器为例,结合CTF逆向与软件安全分析中的典型问题,详解如何将汇编指令转化为Z3约束,并探讨位宽处理、多解枚举等关键实现细节

weixin_33725126的博客 308

利用TOA与最小二乘法直接求解

为了利用到达时间(TOA)和最小二乘法直接求解,我们首先需要理解TOA定位的基本原理和最小二乘法的应用。

chao189844的博客 707

Matlab:Matlab编程语言应用之数学计算(基本数学知识、高低阶函数求根、方程组求根&指数方程求解&对数方程求解&函数方程展开与合并)的简介、案例实现之详细攻略

Matlab:Matlab编程语言应用之数学计算(基本数学知识、高低阶函数求根、方程组求根&指数方程求解&对数方程求解&函数方程展开与合并)的简介、案例实现之详细攻略。%factor([x^2-y^2, x^3+y^3]) %factor命令对多个方程进行因式分解?%在范围-8< x

走向CTO之路 1001

F(X)--c#求解-英雄会在线编程题目

先看题目: F(X) 发布公司:有 效 期:赛 区: CSDN2014-04-16至2015-04-16北京 难 度 等 级:答 题 时 长:编程语言要求: 120分钟C C++ Java C#                 题目详情 我们定义 F(x)是满足 x  mod(a*b) == 0这样的a,b的组数。现在给你一个n,你需要求出 F(n)

mamihong的专栏 1272

Matlab:Matlab编程语言应用之数学计算(向量&数组&矩阵索引、矩阵索引&四则运算、行列式与线性系统求解)的简介、案例实现之详细攻略

​ Matlab:Matlab编程语言应用之数学计算(向量&数组&矩阵索引、矩阵索引&四则运算、行列式与线性系统求解)的简介、案例实现之详细攻略 目录 数学计算(向量&数组&矩阵索引、矩阵索引&四则运算、行列式与线性系统求解)的简介 案例应用 数学计算(向量&数组&矩阵索引、矩阵索引&四则运算、行列式与线性系统求解)的简介 %命令行窗口,矩阵书写;Function函数的意思 1、向量、数组、矩阵基础 关于向量的基础: (1)、分号 向量vecto

走向CTO之路 649

【免费下载】 mosek教程-优化求解器详细介绍

本文档旨在为广大用户详细介绍mosek优化求解器的安装过程以及其Optimizer API和Fusion API的2-3个应用案例。通过本文,用户可以快速了解mosek的基本操作和应用场景,为实际使用mosek进行优化求解提供参考。 ## 1. mosek简介 mosek是一款高性能的数学优化求解器,适用于解决线性规划、二次规划、半定规划以及混合整数规划等问题。它具有以下特点: - 高性能:...

gitblog_06725的博客 1481
上一篇: ASP.NET MVC 远程下载文件
下一篇: asp.net Web.config中assembly注册程序集的目的
ai6688
博客等级 码龄12年 2粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值