2013年03月05日   码农之路   4,653 次浏览

举个很常见的例子,现有如下表格:
姓名 课程
张三 语文
张三 数学
张三 物理
李四 语文
李四 数学
李四 物理

想变成如下结果:
姓名 分数
张三 语文,数学,物理
李四 语文,数学,物理

第一种方法:针对课程字段值不是很多的情况

SELECT 姓名,
  MAX(CASE 课程 WHEN '语文' THEN 课程||',' ELSE '' END) ||
  MAX(CASE 课程 WHEN '数学' THEN 课程||',' ELSE '' END) ||
  MAX(CASE 课程 WHEN '物理' THEN 课程||',' ELSE '' END)
FROM TEST
GROUP BY 姓名

可以将SQL中的CASE语句用DECODE代替。

第二种方法:当课程字段值比较多时

SELECT 姓名, MAX(SUBSTR(课程, 2)) 课程
  FROM (SELECT 姓名, SYS_CONNECT_BY_PATH(课程, ',') 课程
          FROM (SELECT 姓名, 课程,
                       姓名 || RN RCHILD,
                       姓名 || (RN - 1) RFATHER
                  FROM (SELECT 姓名, 课程,
                               ROW_NUMBER() OVER(PARTITION BY 姓名 ORDER BY 课程) RN
                          FROM TEST))
        CONNECT BY PRIOR RCHILD = RFATHER
         START WITH RFATHER LIKE '%0')
 GROUP BY 姓名

SQL比较复杂,需要细心的去理解了。

第三种方法:使用聚合函数

不知道为什么ORACLE没有提供聚合函数,但是我们可以使用ORACLE提供的API,自定义聚合函数:

CREATE OR REPLACE FUNCTION STRCAT(INPUT VARCHAR2) RETURN VARCHAR2
  PARALLEL_ENABLE
  AGGREGATE USING STRCAT_TYPE;
  TYPE :
       CREATE OR REPLACE TYPE STRCAT_TYPE AS OBJECT(
              CAT_STRING VARCHAR2(4000), 
              STATIC FUNCTION ODCIAGGREGATEINITIALIZE(CS_CTX IN OUT STRCAT_TYPE) RETURN NUMBER, 
              MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT STRCAT_TYPE, VALUE IN VARCHAR2) RETURN NUMBER, 
              MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT STRCAT_TYPE, CTX2 IN OUT STRCAT_TYPE) RETURN NUMBER, 
              MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN OUT STRCAT_TYPE, RETURNVALUE OUT VARCHAR2, FLAGS IN 
 
NUMBER) RETURN NUMBER
       )
 
-- 使用方法
SELECT 姓名, STRCAT(课程) FROM TEST GROUP BY 姓名;
赞 赏
申明:除非注明,本站文章均为原创,转载请以链接形式标明本文地址。 如有问题,请于一周内与本站联系,本站将在第一时间对相关内容进行处理。
本文地址: http://www.yyjjssnn.cn/articles/683.html
相关阅读: ORACLE

>>> Hello World <<<

这篇内容是否帮助到你了呢?

如果你有任何疑问或有建议留给其他朋友,都可以给我留言。

:wink: :twisted: :surprised: :smile: :smile9: :smile8: :smile7: :smile6: :smile5: :smile56: :smile55: :smile54: :smile53: :smile52: :smile51: :smile50: :smile4: :smile49: :smile48: :smile47: :smile46: :smile45: :smile44: :smile43: :smile42: :smile41: :smile40: :smile3: :smile39: :smile38: :smile37: :smile36: :smile35: :smile34: :smile33: :smile32: :smile31: :smile30: :smile2: :smile29: :smile28: :smile27: :smile26: :smile25: :smile24: :smile23: :smile22: :smile21: :smile20: :smile1: :smile19: :smile18: :smile17: :smile16: :smile15: :smile14: :smile13: :smile12: :smile11: :smile10: :smile0: :sad: :rolleyes1: :redface: :razz: :question: :neutral: :mrgreen: :mad: :lol: :idea: :exclaim: :evil: :eek: :cry: :cool: :confused: :biggrin: :arrow:

友情链接: 程序员刘杨 刘杨
Copyright 2003~2018 保留所有权利 | 网站地图
备案号:湘ICP备14001005号-2

湘公网安备 43011102001322号