`
lishumingwm163.com
  • 浏览: 338546 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

oracle 列转行

 
阅读更多

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



需要将每个产品进行汇总,通过ichartjs进行展示,图表中需要数据的顺序是:

 

 

Java代码 复制代码 收藏代码
  1. var data = [
  2. { name : '产品1', value:[145,192,198,180], color:'#dad81f' },
  3. { name : '产品2', value:[135,210,180,210], color:'#1f7e92' },
  4. { name : '产品3', value:[198,210,198,198], color:'#76a871' },
  5. ];
  6. var labels = ["2013-10-10 13:21",
  7. "2013-10-10 13:22",
  8. "2013-10-10 13:23",
  9. "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 函数处理,结果会没有排序效果:

Sql代码 复制代码 收藏代码
  1. 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

结果最后一位与第二位错位:


突然想,进行排序后拼接呢?

Sql代码 复制代码 收藏代码
  1. 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

不行!语句根本就不通!在内部进行排序再拼接呢?

Sql代码 复制代码 收藏代码
  1. 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

结果是:


跟上面一样,都不行。最后不用分组来处理,发现结果能实现排序,不过就是记录多了点:

Sql代码 复制代码 收藏代码
  1. SELECTNAME,
  2. WMSYS.WM_CONCAT(counter) OVER(PARTITION BYNAMEORDERBYNAME,UTC) KEY,
  3. row_number() over(PARTITION BYNAMEORDERBYNAMEdesc) rs
  4. 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创建语句如下:

Sql代码 复制代码 收藏代码
  1. SELECT A.NAME,MAX(KEY) AS counter FROM (SELECTNAME,
  2. WMSYS.WM_CONCAT(counter) OVER(PARTITION BYNAMEORDERBYNAME,UTC) KEY,
  3. row_number() over(PARTITION BYNAMEORDERBYNAMEdesc) rs
  4. from a_test ) A
  5. 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. 注意,如果在产品根据分组的条件(本列子中是将数据分四组,是按照时间分组的)不能确定,或者会不规则,就不能使用这个方案来处理,比如分组的时间中间有一个断档了,结果就不正确:


看看,结果永远是下面这个:

其实我们要的是这样的(注意最后一排逗号中间的空格):

Sql代码 复制代码 收藏代码
  1. NAME COUNTER
  2. 1 产品1 145,192,198,180,167,166
  3. 2 产品2 135,210,180,210,188,164
  4. 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 列转行 DECODE函数用法

    总之,Oracle的DECODE函数是处理列值转换的强大工具,它可以在列转行的过程中帮助你构建灵活且易于理解的查询结果。结合PIVOT和其他函数,你可以实现复杂的报表逻辑,让数据分析变得更加简单直观。在实际应用中,...

    oracle的列转行问题

    Oracle 列转行问题解决方案 Oracle 数据库中,列转行问题是一个非常传统的话题。在这个问题中,我们需要将行数据转换成不同的列表示,或者将不同的列数据写到同一列的不同行上。这种问题在实际应用中非常常见,如将...

    oracle的列转行函数

    SELECT TRIM(',' FROM SYS.STRAGG(A_NAME||NVL2(A_NAME,',','')))as nams FROM A_TEMP

    Oracle的列转行问题

    总结来说,Oracle中的列转行可以通过多种方法实现,包括传统的`DECODE`或`CASE`结合子查询,以及从11g版本开始提供的`PIVOT`功能。选择哪种方法取决于具体的需求和数据规模,以及对性能的考虑。在处理大数据量时,应...

    oracle行转列,列转行的例子

    oracle行转列,列转行的例子

    oracle中实现列转行实例

    oracle中实现列转行实例,有表的创建,数据的插入,查询的sql

    Oracle逗号分隔列转行实现方法

    因此用到了逗号分隔列转行的方法。目前该方法只适合在oracle数据库中使用。该方法只需要sql语句就可以实现列转行。  下面给出该方法的示例: select a,b,c from(with test as (select ‘aaa’ a,’bbb’ b,’1,2,3...

    oracle 多列分组和行转列 理解和实例

    理解日常工作中常用到的多列分组, 如【统计不同部门、 不同职位的平均工资】和 行转列 包含例子 和 个人理解分析

    列转行小工具

    在Oracle Developer中,"列转行小工具"是一种实用功能,它主要用于处理数据库表中的数据,将多列数据转换为单列数据,通常涉及到的是数据的行列转换操作。这种操作在处理复杂的数据分析、报表生成或者接口对接时非常...

    oracle wm_concat 列转行 逗号分隔

    Oracle中的WM_CONCAT函数是一个非标准的聚合函数,主要用于将多行数据合并成单行,以逗号分隔的形式返回。这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。...

    ORACLE 行列转换

    本文将详细介绍如何在Oracle中实现行转列(即行列转换的一种)以及列转行的操作,分别通过使用`decode`函数和`insert...select`语句来实现。 ### 一、使用`decode`函数进行“行转列” #### 1. **背景与需求** 在...

    sql行转列,与列转行

    sql 行转列 与列转行,oracle ,msssql等,详细数据库操作方法,各种例子,欢迎大家学习。、~

    ORACLE 10g 的行列转换(学生科目成绩)测试题

    在Oracle数据库管理中,数据处理有时需要将行数据转换为列数据,或者将列数据转换为行数据,这种操作被称为行列转换。Oracle 10g 提供了多种方法来实现这种转换,包括使用PIVOT和UNPIVOT操作,以及自定义SQL查询等。...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。从Oracle 11g版本开始,引入了PIVOT和UNPIVOT关键字,以支持显式的查询转换,即从行数据转换为列数据,或从列...

    oracle行转列

    - T-SQL_经典行专列、列转行,分页及存储过程.doc:T-SQL是SQL Server的扩展,但其中的行转列和分页概念与Oracle相似。在Oracle中,可以使用ROW_NUMBER()函数配合PARTITION BY和ORDER BY来实现分页查询。 - oracle_...

Global site tag (gtag.js) - Google Analytics