2013年03月05日   码农之路   4,785 次浏览
举个很常见的例子,现有如下表格:
姓名 课程
张三 语文
张三 数学
张三 物理
李四 语文
李四 数学
李四 物理
想变成如下结果:
姓名 分数
张三 语文,数学,物理
李四 语文,数学,物理
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 姓名; |
>>> Hello World <<<
这篇内容是否帮助到你了呢?
如果你有任何疑问或有建议留给其他朋友,都可以给我留言。