`

oracle 列转行函数 WMSYS.WM_CONCAT 排序不规则处理

 
阅读更多

业务中做报表,需要将一列列数据汇总成一行,然后汇总,如下:



需要将每个产品进行汇总,通过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的解决方案。

 

 

 

 

 

 

 

  • 大小: 14.2 KB
  • 大小: 3.5 KB
  • 大小: 3.7 KB
  • 大小: 8.1 KB
  • 大小: 20.7 KB
  • 大小: 4.1 KB
4
3
分享到:
评论
3 楼 chwshuang 2014-11-13  
dgncye929 写道
其实,加上 distinct 就可解决问题:

SELECT t.NAME, WMSYS.WM_CONCAT(distinct counter) counter FROM (SELECT NAME,counter FROM a_test WHERE UTC < 13 ORDER BY UTC ASC) T GROUP BY NAME 

原出处:

http://stackoverflow.com/questions/4970477/oracle-sql-wm-concat-order-by



谢谢~!
2 楼 dgncye929 2014-11-06  
其实,加上 distinct 就可解决问题:

SELECT t.NAME, WMSYS.WM_CONCAT(distinct counter) counter FROM (SELECT NAME,counter FROM a_test WHERE UTC < 13 ORDER BY UTC ASC) T GROUP BY NAME 

原出处:

http://stackoverflow.com/questions/4970477/oracle-sql-wm-concat-order-by
1 楼 education_study 2014-03-13  
帮了我大忙了~~

相关推荐

Global site tag (gtag.js) - Google Analytics