三种数据库多行变一行

一、多行变一行

mysql:

select user_id,GROUP_CONCAT(query_word order by query_word SEPARATOR ',' ) from platform_search_query group by user_id


sqlserver:

select a.gasId,
    
    name=(
            SELECT    ',' + name FROM (
                SELECT DISTINCT h.name FROM InstallationDevice h WHERE  a.gasId=h.gasId
            ) a FOR xml path ( '' )
        )
    
    from GasStation a

oracle:
1.listagg 函数------(有长度限制)
SELECT listagg(字段, ',') within group(ORDER BY 字段) AS NAMES FROM 表 GROUP BY 字段
//去重:regexp_replace(listagg函数, '([^,]+)(,\1)+', '\1')
2.用聚合函数,然后使用 wmsys.wm_concat(拼接字段) 方法------(有长度限制,可去重)
select wmsys.wm_concat(distinct 字段) as 字段别名 from table t group by 字段
3.无长度限制的方法
select XMLAGG(XMLELEMENT(E, 待拼接字段 || ',') ORDER BY 排序字段).EXTRACT('//text()').getclobval() as 别名 from 表名 GROUP BY 分组字段

SELECT rtrim(xmlagg(xmlparse(content 待拼接字段 || ',' wellformed) ORDER BY 排序字段).getclobval(),',') 别名 from 表名 GROUP BY 分组字段 //该方法更快

二、一行变多行

sql server:

原始数据:


有些名称是以","分开的,表示有多个单位,这种情况需要转为多行。

外面套了个去重:

select distinct F_MAINTUNITNAME from (

	SELECT  A.f_GasStationId, B.F_MAINTUNITNAME  FROM
	(
	   SELECT  f_GasStationId, [F_MAINTUNITNAME] =  CONVERT (xml, '<root><v>'  +  REPLACE ([F_MAINTUNITNAME],  ',' ,  '</v><v>' ) +  '</v></root>' )  FROM  V_Gis_GasList
	) A  OUTER  APPLY
	(
	   SELECT  F_MAINTUNITNAME = N.v.value( '.' ,  'varchar(100)' )  FROM  A.[F_MAINTUNITNAME].nodes( '/root/v' ) N(v)
	) B
	where B.F_MAINTUNITNAME is not null
	
) taba 
order by F_MAINTUNITNAME

文/程忠 浏览次数:0次   2022-07-01 11:51:50

相关阅读


评论:
点击刷新