oracle数据库中如何将一列的内容转换成多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库中如何将一列的内容转换成多行相关的知识,希望对你有一定的参考价值。

比如,现在有一列,列名为"检查费用",内容分别是护理费,诊断费,药费等 , 如何将此列的内容转换成要输出的表格的几个列,并且求和?

需要用wm_concat函数。

如test表中有如下数据:

现在要name列的内容都显示到同一行,可用如下语句:

select wm_concat(name) from test;

查询结果:

参考技术A select max(case when 检查费用 = 护理费 then 检查费用 else null end)
, max(case when 检查费用 = 护理费 then 检查费用else null end)
, max(case when 检查费用 = 护理费 then 检查费用 else null end)
,sum(max(case when 检查费用 = 护理费 then 检查费用 else null end) + max(case when 检查费用 = 护理费 then 检查费用else null end)
+ max(case when 检查费用 = 护理费 then 检查费用 else null end))
from table
参考技术B 1、需要确保各种费用之间是有分隔符的,比如逗号
2、因为要做求和,因此需要确保费用值是数值类型的
3、每行数据的费用种类的数量是否一致?

在确认了上面的问题后,可以编写一个自定义函数来实现
参考技术C select 病人,
sum(decode(检查费用,'护理费', 护理金额,0) as 护理费 ,
sum(decode(检查费用,'诊断费', 诊断费金额,0) as 诊断费 ,
.............
from biao group by 病人本回答被提问者采纳
参考技术D 总得有个条件判断是什么费用才行哦。。你是从哪里判断出事护理费,诊断费的。。。补充问题说清楚,要不神仙也帮不了你啊。。我关注着。。

比如从别的列进行判断 是哪个部门 出示的检查费用。。

或者 检查费用 这个列 是VARCHAT2型的,"222.00(护理费用)"。。

如何将Oracle中同一列的多行记录拼接成一个字符串

1、新建php文件。

2、声明数组变量。

3、用implode函数使数组拼接成字符串,连接符为-。

4、输出连接后的字符串。

5、预览效果如图。

6、用implode函数使数组拼接成字符串,连接符为?。

7、预览效果如图。

参考技术A

需要用wm_concat函数来实现。

如目前在emp表中查询数据如下:

要按照deptno相同的将ename以字符串形式合并,可用如下语句:

select deptno,wm_concat(ename) from emp group by deptno;

查询结果:

参考技术B 我们常常说 用SQL将Oracle中同一列的多行记录拼接成一个字符串是如何实现的:[sql]-- 原始数据-- a 111-- b 222-- a 333-- a 444-- b 555-- 最终结果-- a 111*333*444SELECTL4.L_TIME,MAX(SUBSTR(L4.分组内容,2)) 最终字段值FROM(SELECTL3.L_TIME,SYS_CONNECT_BY_PATH(L3.L_CONTENT,'*') AS 分组内容FROM(SELECTL2.L_TIME,L2.L_CONTENT,L2.L_TIME||L2.分组内编号 AS 分组字段加编号,L2.L_TIME||(L2.分组内编号-1) AS 上级分组字段加编号FROM(SELECTL1.L_TIME -- 分组依据,L1.L_CONTENT -- 同一列中 要合并的不同行 的值,ROW_NUMBER() OVER (PARTITION BY L1.L_TIME ORDER BY L1.L_CONTENT ASC) 分组内编号FROM LOGS L1) L2) L3START WITH L3.上级分组字段加编号 LIKE '%0'CONNECT BY PRIOR L3.分组字段加编号=L3.上级分组字段加编号) L4WHERE L_TIME='111'GROUP BY L4.L_TIME-- ROW_NUMBER() OVER(PARTITION BY A ORDER BY B DESC) 新列名-- 根据A分组,在分组内部根据B排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)-- SYS_CONNECT_BY_PATH 函数: 第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符-- CONNECT BY PRIOR 是标示父子关系的对应-- START WITH 代表你要开始遍历的的节点本回答被提问者采纳 参考技术C 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)
FROM temp
Group BY Nation;

参考技术D 使用CURSOR循环拼接即可!

以上是关于oracle数据库中如何将一列的内容转换成多行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server将一列的多行内容拼接成一行

关于SQL Server将一列的多行内容拼接成一行的问题讨论

关于SQL Server将一列的多行内容拼接成一行的问题讨论

如何将Oracle中同一列的多行记录拼接成一个字符串

关于SQL Server将一列的多行内容拼接成一行,合并显示在另外表中

Oracle一列的多行数据拼成一行显示字符