oracle 列转行函数 WMSYS.WM_CONCAT 排序不规则处理
2015-04-27 18:10
411 查看
源自:http://www.tuicool.com/articles/mmiAJf
ITeye-博客
原文 http://chwshuang.iteye.com/blog/1954415
业务中做报表,需要将一列列数据汇总成一行,然后汇总,如下:
需要将每个产品进行汇总,通过ichartjs进行展示,图表中需要数据的顺序是:
如果直接用oracle 列转行函数 WMSYS.WM_CONCAT 函数处理,结果会没有排序效果:
结果最后一位与第二位错位:
突然想,进行排序后拼接呢?
不行!语句根本就不通!在内部进行排序再拼接呢?
结果是:
跟上面一样,都不行。最后不用分组来处理,发现结果能实现排序,不过就是记录多了点:
怎么办? ..........哦...........外围加个查询语句,来个分组取最大值,怎么样?
通过oracle 列转行函数 WMSYS.WM_CONCAT创建语句如下:
得到结果
到此,通过oracle 列转行函数 WMSYS.WM_CONCAT进行排序结束,结果令人满意。
总结:
1. 记录下来,给以后的自己和需要的人来点灵感,遇到问题后要一步步的分析逻辑,哪怕第一个主意不能解决问题,关键要开动脑筋想。
2. oracle的函数不一定能解决问题,有时候很多技巧加很多函数才是解决方案。
3. 注意,如果在产品根据分组的条件(本列子中是将数据分四组,是按照时间分组的)不能确定,或者会不规则,就不能使用这个方案来处理,比如分组的时间中间有一个断档了,结果就不正确:
看看,结果永远是下面这个:
其实我们要的是这样的(注意最后一排逗号中间的空格):
遇到这种情况,就可能需要程序来处理。我目前还没有找到oracle的解决方案。
oracle 列转行函数 WMSYS.WM_CONCAT 排序不规则处理
时间 2013-10-10 16:05:51ITeye-博客
原文 http://chwshuang.iteye.com/blog/1954415
业务中做报表,需要将一列列数据汇总成一行,然后汇总,如下:
需要将每个产品进行汇总,通过ichartjs进行展示,图表中需要数据的顺序是:
var data = [ { name : '产品1', value:[145,192,198,180], color:'#dad81f' }, { name : '产品2', value:[135,210,180,210], color:'#1f7e92' }, { name : '产品3', value:[198,210,198,198], color:'#76a871' }, ]; var labels = ["2013-10-10 13:21", "2013-10-10 13:22", "2013-10-10 13:23", "2013-10-10 13:24"];
如果直接用oracle 列转行函数 WMSYS.WM_CONCAT 函数处理,结果会没有排序效果:
SELECT NAME,WMSYS.WM_CONCAT(counter) counter FROM a_test t GROUP BY NAME
结果最后一位与第二位错位:
突然想,进行排序后拼接呢?
SELECT NAME,WMSYS.WM_CONCAT(counter) counter FROM a_test t ORDER BY NAME GROUP BY NAME
不行!语句根本就不通!在内部进行排序再拼接呢?
SELECT t.NAME, WMSYS.WM_CONCAT(counter) counter FROM (SELECT NAME,counter FROM a_test WHERE UTC < 13 ORDER BY UTC ASC) T GROUP BY NAME
结果是:
跟上面一样,都不行。最后不用分组来处理,发现结果能实现排序,不过就是记录多了点:
SELECT NAME, WMSYS.WM_CONCAT(counter) OVER(PARTITION BY NAME ORDER BY NAME,UTC) KEY, row_number() over(PARTITION BY NAME ORDER BY NAME desc) rs from a_test
怎么办? ..........哦...........外围加个查询语句,来个分组取最大值,怎么样?
通过oracle 列转行函数 WMSYS.WM_CONCAT创建语句如下:
SELECT A.NAME,MAX(KEY) AS counter FROM (SELECT NAME, WMSYS.WM_CONCAT(counter) OVER(PARTITION BY NAME ORDER BY NAME,UTC) KEY, row_number() over(PARTITION BY NAME ORDER BY NAME desc) rs from a_test ) A
GROUP BY NAME
得到结果
到此,通过oracle 列转行函数 WMSYS.WM_CONCAT进行排序结束,结果令人满意。
总结:
1. 记录下来,给以后的自己和需要的人来点灵感,遇到问题后要一步步的分析逻辑,哪怕第一个主意不能解决问题,关键要开动脑筋想。
2. oracle的函数不一定能解决问题,有时候很多技巧加很多函数才是解决方案。
3. 注意,如果在产品根据分组的条件(本列子中是将数据分四组,是按照时间分组的)不能确定,或者会不规则,就不能使用这个方案来处理,比如分组的时间中间有一个断档了,结果就不正确:
看看,结果永远是下面这个:
其实我们要的是这样的(注意最后一排逗号中间的空格):
NAME COUNTER 1 产品1 145,192,198,180,167,166 2 产品2 135,210,180,210,188,164 3 产品3 198,210,198,198,,165
遇到这种情况,就可能需要程序来处理。我目前还没有找到oracle的解决方案。
相关文章推荐
- oracle 列转行函数 WMSYS.WM_CONCAT 排序不规则处理
- Oracle 函数 wm_concat 将列转行 用法 实例
- oracle 函数WMSYS.WM_CONCAT()的用法(行转列)
- oracle 函数 WMSYS.WM_CONCAT 的用法 与 mysql 函数GROUP_CONCAT的用法
- 初学Oracle UNPIVOT,PIVOT,WMSYS.WM_CONCAT三个函数
- oracle wmsys.wm_concat 函数的使用
- oracle 函数 WMSYS.WM_CONCAT 的用法 与 mysql 函数GROUP_CONCAT的用法
- Oracle List 功能 《=》 Oracle: wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- Oracle多行转一行:wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- oracle 函数WMSYS.WM_CONCAT()的用法
- ORACLE wmsys.wm_concat()函数把某列数据整合到一起
- oracle中的wmsys.wm_concat()函数
- Oracle: wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- Oracle内部函数 wmsys.wm_concat 替换办法及思考
- Oracle: wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- oracle中的wmsys.wm_concat()函数
- oracle 函数 WMSYS.WM_CONCAT 与对应 mysql 函数GROUP_CONCAT的用法
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)
- oracle函数介绍(1)――WMSYS.WM_CONCAT行转列
- mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()