数据库实现列值合并为行
轉載自:http://hi.baidu.com/wangzhiqing999/blog/item/40982215996caa62cb80c46e.html
?
CREATE TABLE TestTitle (
? name?? VARCHAR(10),
? seq??? INT,
? title? VARCHAR(10)
);
?
INSERT INTO TestTitle VALUES ('張三', 3, '程序員');
INSERT INTO TestTitle VALUES ('張三', 1, '系統(tǒng)管理員');
INSERT INTO TestTitle VALUES ('張三', 2, '網絡管理員');
INSERT INTO TestTitle VALUES ('李四', 2, '項目經理');
INSERT INTO TestTitle VALUES ('李四', 1, '系統(tǒng)分析員');
?
這里要求 是, 合并后, 字符的順序,是按照? seq? 來排序的
也就是最后的結果,希望是
李四???? 系統(tǒng)分析員,項目經理
張三???? 系統(tǒng)管理員,網絡管理員,程序員
?
?
?
對于MySQL使用?GROUP_CONCAT 函數?的方式進行處理
?首先是 不排序的情況下,默認的查詢結果:
?
?
mysql> SELECT
??? ->?? name,
??? ->?? GROUP_CONCAT(title) AS allTitle
??? -> FROM
??? ->?? TestTitle
??? -> GROUP BY
??? ->?? name;
+------+------------------------------+
| name | allTitle???????????????????? |
+------+------------------------------+
| 李四 | 項目經理,系統(tǒng)分析員????????? |
| 張三 | 程序員,系統(tǒng)管理員,網絡管理員 |
+------+------------------------------+
2 rows in set (0.00 sec)
?
然后是按照?seq?? 的順序進行排列的查詢結果:
mysql> SELECT
??? ->?? name,
??? ->?? GROUP_CONCAT(title) AS allTitle
??? -> FROM
??? ->?? (
??? ->?? SELECT
??? ->???? name,
??? ->???? title
??? ->?? FROM
??? ->???? TestTitle
??? ->?? ORDER BY
??? ->???? seq
??? ->?? ) as subQuery
??? -> GROUP BY
??? ->?? name;
+------+------------------------------+
| name | allTitle???????????????????? |
+------+------------------------------+
| 李四 | 系統(tǒng)分析員,項目經理????????? |
| 張三 | 系統(tǒng)管理員,網絡管理員,程序員 |
+------+------------------------------+
2 rows in set (0.00 sec)
?
?
?
對于Oracle使用?WMSYS.WM_CONCAT 函數?的方式進行處理
?
首先是 不排序的情況下,默認的查詢結果:
SQL>
SQL> SELECT
? 2??? name,
? 3??? WMSYS.WM_CONCAT(title) AS allTitle
? 4? FROM
? 5??? TestTitle
? 6? GROUP BY
? 7??? name;
NAME
----------
ALLTITLE
-------------------------------------------
李四
項目經理,系統(tǒng)分析員
張三
程序員,系統(tǒng)管理員,網絡管理員
?
然后是按照?seq?? 的順序進行排列的查詢結果:
SQL> with myCTE AS
? 2? (
? 3??? SELECT
? 4????? name,
? 5????? seq,
? 6????? WMSYS.WM_CONCAT(title)
? 7????????? OVER(PARTITION BY? name?? ORDER BY?? seq) AS allTitle
? 8??? FROM
? 9????? TestTitle
?10? )
?11? SELECT
?12??? name, allTitle
?13? FROM
?14??? myCTE
?15? WHERE
?16??? NOT EXISTS(
?17????? SELECT 1
?18????? FROM myCTE sub
?19????? WHERE myCTE.name = sub.name
?20??????? AND myCTE.seq < sub.seq
?21??? );
NAME
----------
ALLTITLE
--------------------------------------------------------------
李四
系統(tǒng)分析員,項目經理
張三
系統(tǒng)管理員,網絡管理員,程序員
?
select from ipms_case,(select case_id ,ltrim(sys_connect_by_path(name, '$@$'), '$@$') as name ,ltrim(sys_connect_by_path(SERVER_HOSTING_ADDRESS, '$@$'), '$@$') as SERVER_HOSTING_ADDRESS ,ltrim(sys_connect_by_path(ICP_REC_NUM , '$@$'), '$@$') as ICP_REC_NUM ,ltrim(sys_connect_by_path(ICP_REG_ADDR, '$@$'), '$@$') as ICP_REG_ADDR,ltrim(sys_connect_by_path(HOME_WEB_URL, '$@$'), '$@$') as HOME_WEB_URL ,ltrim(sys_connect_by_path(IP_ADDR, '$@$'), '$@$') as IP_ADDR from (select asso.case_id as case_id,site.NAME as name,site.SERVER_HOSTING_ADDRESS as SERVER_HOSTING_ADDRESS,site.ICP_REC_NUM as ICP_REC_NUM ,site.ICP_REG_ADDR as ICP_REG_ADDR,site.HOME_WEB_URL as HOME_WEB_URL,site.IP_ADDR as IP_ADDR,(row_number() over(partition by asso.case_id order by asso.case_id) ) numid from IPMS_CASE_SITE_ASSO asso,ipms_website sitewhere asso.SITE_ID=site.id )start with numid = 1 connect by numid - 1 = prior numid and case_id = prior case_id )?
總結
以上是生活随笔為你收集整理的数据库实现列值合并为行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: servlce与filter的url-p
- 下一篇: 数据库事务转载基础一:oarcle事务