Oracle不同行的某列字符串相加,去除重复值
有如下表Test
City People Make
广州 1 A
广州 2 B
广州 3 C
上海 4 A
上海 5 E
广州 6 A
上海 7 E
实现如下效果
City People Make
上海 16 AE
广州 12 ABC
在公司论坛看到有人对这个要求的实现,觉得有点复杂。自己研究了下,重新写了下sql如下:
9I(没有环境测试,但是函数在9I中好像都是已经有了的):
WITH TEST AS (SELECT CITY,MAKE,SUM(PEOPLE) PEOPLE from Test GROUP BY CITY,MAKE ORDER BY CITY,MAKE)
SELECT CITY,SUM(PEOPLE),(select REVERSE(ltrim(max(sys_connect_by_path(MAKE,',')),',')) MAKE
from
(
SELECT MAKE,CITY,ROWNUM numberid from TEST
) T1 WHERE T1.CITY = T2.CITY
start with T.CITY = T2.CITY connect by prior numberid = numberid+1
) MAKE from TEST T2 GROUP BY CITY
10G:
WITH TEST AS (SELECT CITY,MAKE,SUM(PEOPLE) PEOPLE from Test GROUP BY CITY,MAKE ORDER BY CITY,MAKE)
SELECT CITY,SUM(PEOPLE),WMSYS.WM_CONCAT(MAKE) from TEST GROUP BY CITY
==========================================================
相关关键字:
1.sys_connect_by_path 函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分
2.start with ... connect by prior ... 递归实现,如
start with pid= 1 connect by prior pid = id
//父id=子id 正树型结构 子id=父id 倒树型结构
上面的SQL中注意
start with T.CITY = T2.CITY connect by prior numberid = numberid+1
与start with T.CITY = T2.CITY connect by prior numberid+1 = numberid的区别
3.REVERSE字符串反转
===========================================================
回顾下其他:
1.Group By, Having, Where, Order by几个语句的执行顺序。一个SQL语句往往会产生多个临时视图,那么这些关键字的执行顺序就非常重要了,因为你必须了解这个
相关文档:
SQLProgress是一个小巧的操作数据库的工具,所有的版本都不超过3M,包括现在最新的34版本。33以及以前的版本需要安装BDE才能运行,从34开始,只支持Oracle数据库,采用ODAC作为数据库访问的接口,只需要一个不到3M的可执行文件就可以对数据库进行操作,其他什么都用安装。该版本是在SQLProgress1.01.33基础上修改的,33是BD ......
select * from (select pro_id, sum(decode(month, '01', summ)) one,
sum(decode(month, '02', summ)) two,
&nb ......
select table_name from user_tables; //当前用户的表
select table_name from all_tables; //所有用户的表
select table_name from dba_tables; &n ......
-----------------------------------------------------------------------------------
DOS:
1. sqlplus
2.
用户名:sqlplus 、conn
密码:as sysdba 、as sysdba
解锁:
3. ALTER USER DBSNMP ACCOUNT UNLOCK;
解锁:system
4. alter user system identified by manage ......
查看session等待事件:
select sid,event from v$session_wait where event not like 'rdbms%' and event not like 'SQL*Net message%';
按pid查看正在执行的程序:
select sid,program from v$session b where paddr in (selec ......