业务中做报表,需要将一列列数据汇总成一行,然后汇总,如下:
需要将每个产品进行汇总,通过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"];
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 函数处理,结果会没有排序效果:
- SELECTNAME,WMSYS.WM_CONCAT(counter) counter FROM a_test t GROUPBYNAME
SELECT NAME,WMSYS.WM_CONCAT(counter) counter FROM a_test t GROUP BY NAME
结果最后一位与第二位错位:
突然想,进行排序后拼接呢?
- SELECTNAME,WMSYS.WM_CONCAT(counter) counter FROM a_test t ORDERBYNAMEGROUPBYNAME
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 (SELECTNAME,counter FROM a_test WHERE UTC < 13 ORDERBY UTC ASC) T GROUPBYNAME
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
结果是:
跟上面一样,都不行。最后不用分组来处理,发现结果能实现排序,不过就是记录多了点:
- SELECTNAME,
- WMSYS.WM_CONCAT(counter) OVER(PARTITION BYNAMEORDERBYNAME,UTC) KEY,
- row_number() over(PARTITION BYNAMEORDERBYNAMEdesc) rs
- from a_test
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 (SELECTNAME,
- WMSYS.WM_CONCAT(counter) OVER(PARTITION BYNAMEORDERBYNAME,UTC) KEY,
- row_number() over(PARTITION BYNAMEORDERBYNAMEdesc) rs
- from a_test ) A
- GROUPBYNAME
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
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列转行的方法,有些时候页面显示要通过后台的列转行去实现,我们可以直接从sql中解决后台很复杂的问题
oracle的列转行问题 oracle的列转行问题
NULL 博文链接:https://lisanlai.iteye.com/blog/793404
SELECT TRIM(',' FROM SYS.STRAGG(A_NAME||NVL2(A_NAME,',','')))as nams FROM A_TEMP
Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题。 网络上流传了很多将行数据转换称列数据的方法和应用实例,一般通过decode或者case函数...
oracle中实现列转行实例,有表的创建,数据的插入,查询的sql
oracle wm_concat函数,用于列转行,逗号分隔本文将详细介绍此功能的应用
oracle行转列_列转行,实例加解析,自己测试没问题。免费分享了~
oracle developer 列转行 in的入参转换
sql 行转列 与列转行,oracle ,msssql等,详细数据库操作方法,各种例子,欢迎大家学习。、~
ORACLE 行列转换,ORACLE,行列转换
DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列
NULL 博文链接:https://hb-keepmoving.iteye.com/blog/803348
关于oracle数据库如何行转列SQL语句。
因此用到了逗号分隔列转行的方法。目前该方法只适合在oracle数据库中使用。该方法只需要sql语句就可以实现列转行。 下面给出该方法的示例: select a,b,c from(with test as (select ‘aaa’ a,’bbb’ b,’1,2,3...
oracle游标使用大全,其中有很多例子,有助于大家理解,希望对初学者有帮助
由自己手敲代码已验证好用,里面有索引,存储过程,函数
oracle数据库最详细的行转列资料,是官方文档的详细介绍版,中文的
主要介绍了Oracle数据表中行转列与列转行的操作方法,这里分静态和动态情况作出了分类讨论,需要的朋友可以参考下