データベースで列の値を行に統合します。

3873 ワード

自己転載:http://hi.baidu.com/wangzhiqing999/blog/item/40982215996caa62cb80c46e.html  CREATE TABLE TestTitle(  name   VRCHAR(10)、  seq    INT、  title  VRCHAR(10)  INSERT INTO TestTitle VALES('張三',3''プログラマ')INSERT INTO TestTitle VALES('張三',1,'システム管理者')INSERT INTO TestTitle VALES('張三',2,'ネットワーク管理者')INSERT INTO TestTitle VALES('李四',2''プロジェクトマネージャー')INSERT INTO TestTitle VALES('李四',1,'システムアナライザ')  ここでは、統合後の文字の順番は、  seq  並べ替えに来たのはつまり最後の結果です。李四さんがほしいです。     システムアナライザ、プロジェクトマネージャー張三     システム管理者      MySQLに使用する GROUT_CONCAT関数 の方式で処理します。 最初に並べ替えがない場合、デフォルトのクエリー結果:    mysql>SELECT    ->   name    ->   GROUT_CONCAT AS allTitle    -> FROM    ->   TestTitle    -> GROUTP BY    ->   name;+-------------------------------------------------|name 124 allTitle                     |+------+------------------------------+| 李四|プロジェクトマネージャー、システムアナライザ          || 張三|プログラマー、システム管理者、ネットワーク管理者(----------------------------------------------+2ローws in set(0.00 sec)  そして seq   の順に並べられたアンケート結果:mysql>SELECT    ->   name    ->   GROUT_CONCAT AS allTitle    -> FROM    ->   (    ->   SELECT    ->     name    ->     title    ->   FROM    ->     TestTitle    ->   ORDER BY    ->     seq    ->   ) as subQuery    -> GROUTP BY    ->   name;+-------------------------------------------------name|allTitle                     |+------+------------------------------+| 李四|システムアナライザ、プロジェクトマネージャー          || 張三|システム管理者、ネットワーク管理者、プログラマー(--------------------------------------+2ローws in set(0.00 sec)      Oracleに対して使用する WMSYS.WMUCONCAT関数 の方式で処理します。  まず、並べ替えがない場合、デフォルトの照会結果:SQL>SQL>SELECT  2    name  3    WMSYS.WMUCONCAT AS allTitle  4  FROM  5    TestTitle  6  GROUTP BY  7    name;NAME----------------------------------李四プロジェクトマネージャー、システムアナライザ張三プログラマ、システム管理者、ネットワーク管理者  そして seq   SQL>with mysCTE AS  2  (  3    SELECT  4      name  5      seq  6      WMSYS.WMUCONCAT(title)  7          OVER(PARTTION 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 mysCTE.name=sub.name 20        AND myCTE.seq<sub.seq 21    ); NAME--------------------------------------------李四システムアナライザ、プロジェクトマネージャ張三システム管理者、ネットワーク管理者、プログラマ
 
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 site
				where asso.SITE_ID=site.id 
			)
		 
		   start with numid = 1    
		   connect by numid - 1 = prior numid    and case_id = prior case_id   
)