三种数据库多行变一行
一、多行变一行
mysql:
select user_id,GROUP_CONCAT(query_word order by query_word SEPARATOR ',' ) from platform_search_query group by user_id
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
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑