ORACLE:

SQL> create table t(id int,name varchar2(30));表已创建。SQL> insert into t values(1,'a');已创建 1 行。SQL> insert into t values(1,'b');已创建 1 行。SQL> insert into t values(1,'c');已创建 1 行。SQL> insert into t values(2,'aa');已创建 1 行。SQL> insert into t values(2,'bb');已创建 1 行。SQL> commit;提交完成。--第一种
SQL> select wmsys.wm_concat(distinct name) from t;WMSYS.WM_CONCAT(DISTINCTNAME)
---------------------------------------------------------------------a,aa,b,bb,cSQL> col con_name format a10
SQL> select id,wmsys.wm_concat(distinct name) con_name from t group by id;ID CON_NAME
---------- ----------1 a,b,c2 aa,bb--第二种
SQL> SELECT TRIM(',' FROM SYS.STRAGG(NAME||NVL2(NAME,',',''))) CON_NAME FROM T;CON_NAME
----------
a,b,c,aa,bb--第三种
select id,sys_connect_by_path(name,'>')  con_name
from (select id,name,row_number() over(partition by id order by name) rnfrom (select id,name from t ))t
start with t.rn=1
connect by t.id=prior t.id and t.rn-1=prior t.rn
/ID CON_NAME
---------- --------------------1 >a1 >a>b1 >a>b>c2 >aa2 >aa>bb2 >aa>bb>china2 >aa>bb>china>china
SQL> edit
已写入 file afiedt.buf1  select id,substr(max(sys_connect_by_path(name,'>')),2)  con_name2  from (select id,name,row_number() over(partition by id order by name) rn3       from (select id,name from t ))t4  start with t.rn=15  connect by t.id=prior t.id and t.rn-1=prior t.rn6* group by id
SQL> /ID CON_NAME
---------- --------------------1 a>b>c2 aa>bb>china>china
-- 当然也可以使用wm_concat,这个函数比较旧了
第四种
with temp as(  select 'China' nation ,'Guangzhou' city from dual union all  select 'China' nation ,'Shanghai' city from dual union all  select 'China' nation ,'Beijing' city from dual union all  select 'USA' nation ,'New York' city from dual union all  select 'USA' nation ,'Bostom' city from dual union all  select 'Japan' nation ,'Tokyo' city from dual
)
select nation,listagg(city,',') within GROUP (order by city)
from temp
group by nation 

另外如果是要用引号的话使用:

select '''' || listagg(substr(name, 1, 30), q'{','}') within group(order by name) || ''''
from (select distinct name from demo); 

逗号隔开转多行:

SELECT REGEXP_SUBSTR ('1,2,3', '[^,]+', 1,rownum)
from dual connect by rownum<=LENGTH ('1,2,3') - LENGTH (regexp_replace('1,2,3', ',', ''))+1;

说明:正则函数regexp_substr跟substr类似,这里匹配模式意思是以逗号隔开的字符串,1代表位置,rownum代表第几次匹配

另外rownum也可以 替换为level

如果是老版本升级,没有wm_concat的话可以自己创建一个:

CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT
-- AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
);
/--定义类型body:
CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN
SCTX := WM_CONCAT_IMPL(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
IF(CURR_STR IS NOT NULL) THEN
CURR_STR := CURR_STR || ',' || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN
IF(SCTX2.CURR_STR IS NOT NULL) THEN
SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;
/
--自定义行变列函数:
CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
/create public synonym WM_CONCAT_IMPL for sys.WM_CONCAT_IMPL
/
create public synonym wm_concat for sys.wm_concat
/grant execute on WM_CONCAT_IMPL to public
/
grant execute on wm_concat to public
/

mysql:

mysql> create table t(id int,name varchar(10));
Query OK, 0 rows affected (2.19 sec)mysql> insert into t values(1,'a'),(1,'b'),(2,'c');
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select concat(1,'a');
+---------------+
| concat(1,'a') |
+---------------+
| 1a            |
+---------------+
1 row in set (0.00 sec)mysql> select concat(1,'a',null);
+--------------------+
| concat(1,'a',null) |
+--------------------+
| NULL               |
+--------------------+
1 row in set (0.00 sec)mysql> select concat_ws(1,'a',null);
+-----------------------+
| concat_ws(1,'a',null) |
+-----------------------+
| a                     |
+-----------------------+
1 row in set (0.00 sec)mysql> select concat_ws('A','a',null);
+-------------------------+
| concat_ws('A','a',null) |
+-------------------------+
| a                       |
+-------------------------+
1 row in set (0.00 sec)mysql> select concat_ws(',','A','a',null);
+-----------------------------+
| concat_ws(',','A','a',null) |
+-----------------------------+
| A,a                         |
+-----------------------------+
1 row in set (0.00 sec)mysql> -- 第一个参数是分隔符,并且会摒弃null
mysql> select group_concat(name) from t;
+--------------------+
| group_concat(name) |
+--------------------+
| a,b,c              |
+--------------------+
1 row in set (0.00 sec)mysql> select group_concat(name) from t group by id;
+--------------------+
| group_concat(name) |
+--------------------+
| a,b                |
| c                  |
+--------------------+
2 rows in set (0.00 sec)

MSSQL:

create table ta (name varchar(10),value varchar(20));
insert into ta values('a','beij');
insert into ta values('a','shangh');
insert into ta values('b','shenz');
insert into ta values('b','chongq'); select (','+ value)
from ta for xml path('');  XML_F52E2B61-18A1-11d1-B105-00805F49916B
,beij,shangh,shenz,chongqselect  name,stuff((select ',' +  valuefrom ta as t2where t2. name = t1.nameFOR XML PATH('')),1,1,'') as str1from ta as t1--where t1.name = 'a'group by name;name   str1
a   beij,shangh
b   shenz,chongq

逗号隔开转多行:

create table t1 (id int,value varchar(20));
insert into t1 (id,value) values(1,'China,usa');
insert into t1 (id,value) values(2,'Japan,Russia');select a.id , value = substring(a.value , b.number , charindex(',' , a.value + ',' , b.number) - b.number)
from t1 a join master..spt_values  b
on b.type='p' and b.number between 1 and len(a.value)
where substring(',' + a.value , b.number , 1) = ','

统计逗号隔开的计数:

NOSQLDBA@prod> drop table t;Table dropped.NOSQLDBA@prod> create table t (text varchar(20));Table created.NOSQLDBA@prod> insert into t values('a,b,c');1 row created.NOSQLDBA@prod> insert into t values('b');1 row created.NOSQLDBA@prod> insert into t values('a');1 row created.
NOSQLDBA@prod> col type1 for a20
NOSQLDBA@prod> with temp as2   (select text  from  t)3  select temp1.text type1, count(1) cnt4    from (select substr(text,5                        instr(text, ',', 1, rn) + 1,6                        instr(text, ',', 1, rn + 1) - instr(text, ',', 1, rn) - 1) text7            from (select ',' || t1.text || ',' text, t2.rn8                    from (select text,9                                 length(text) - length(replace(text, ',', '')) + 1 rn10                            from temp) t1,11                         (select rownum rn12                            from all_objects13                           where rownum <=14                                 (select max(length(text) -15                                             length(replace(text, ',', '')) + 1) rn16                                    from temp)) t217                   where t1.rn >= t2.rn18                   order by text, rn)) temp119   group by temp1.text20  union all21  select 'empty' as type1, count(*) as cnt22    from t23   where TEXT is null;TYPE1                       CNT
-------------------- ----------
b                             2
a                             2
c                             1
empty                         0

行转列逗号隔开逗号隔开列转行相关推荐

  1. 使用SQL如何把用逗号等字符隔开的字符串转换成列表,以及把列合并成符合隔开的字符串(转)...

    如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海 用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SEL ...

  2. 日常一记(9)--excel将一列数据用逗号隔开转为一行

    系列文章目录 文章目录 系列文章目录 前言 一.PHONETIC函数 二.excel将一列数据用逗号隔开转为一行 1.情景描述: 2.步骤: 3.可能遇到的问题:数据不是文本格式 总结 前言 一.PH ...

  3. Excel中把一列数据转换成逗号隔开的一行

    先看一张效果图: 如果内容是纯文本的很简单就是在这一列的后面添加一列在添加的一列上填充逗号,然后在任意一格里面输入=PHONETIC(A1:B25)   使用PHONETIC函数就可以解决这个问题,其 ...

  4. 在“D:/mydat“目录下有一个学生名单文件(文本)“student2018.txt“,里面记载了若干学生信息, 每个学生信息单独一行,每行信息共有五列,每列之间用逗号分开, 其每列含义按顺序是:学

    在"D:/mydat"目录下有一个学生名单文件(文本)"student2018.txt",里面记载了若干学生信息, 每个学生信息单独一行,每行信息共有五列,每列 ...

  5. excel多列合并成一列加符号_Excel中如何将每行空格数据隔开为多列,以及如何合并多列数据为一列...

    投稿/科研合作:daixjdoctor@126.com 联系我们:137704924或372699348 群1-5:科研讨论.文献汇报群 网站:http://www.sleep-brain.com/ ...

  6. 【Matlab】如何把数组矩阵写入txt文件?并用逗号或空格隔开

    1.Introduction 话说用Matlab的时候经常遇到读写excel和txt文件,每次都要去搜一下,最近又遇到了写入txt的问题,搜了好半天,终于找到了对应的函数,也趁机记录下. 没有Matl ...

  7. linux awk 某一列合并,利用shell中awk和xargs以及sed将多行多列文本中某一列合并成一行...

    一.问题描述 最近需要利用Shell将多行多列文本中某一列,通过指定的分隔符合并成一行.假设需要处理的文本如下: 我们主要处理的是,将用户名提取处理,合并成一行,并通过逗号进行分隔.最终的格式如下: ...

  8. pandas计算dataframe两列数据值相等的行号、取出DataFrame中两列值相等的行号

    pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号 目录 pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号

  9. oracle 动态sql列转行_Oracle 行转列 动态出转换的列

    10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后,因为pivot的用法中,正常情况下,我们需要转出多少个列,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来 ...

  10. DLA SQL技巧:行、列转换和JSON数据列展开

    1. 简介 在数据库SQL处理中,常常有行转列(Pivot)和列转行(Unpivot)的数据处理需求.本文以示例说明在Data Lake Analytics中,如何使用SQL的一些技巧,达到行转列(P ...

最新文章

  1. linux 关闭打开的文件描述符,关闭它们后重新打开stdout和stdin文件描述符
  2. CV:人工智能之计算机视觉方向的简介(CV发展史+常用数据集+CV职位)、传统方法对比CNN类算法、计算机视觉十大应用(知识导图+经典案例)之详细攻略
  3. jsoup 获取html中body内容_python爬虫之下载盗墓笔记(bs4解析HTML)
  4. 内存分析工具 MAT 的使用
  5. 关于(TabHost),(Button配合Fragment),(Menu)这三种常见的切换界面手法分析...
  6. JACKSON JSON 操作帮助类
  7. 降维系列之 LLE 局部线性嵌入
  8. 《ParaView Tutorial》
  9. 2011新版工业技术 中文核心期刊目录总览
  10. ipadpro编写java代码_iPad Pro变生产力工具,你还缺个轻量级浏览器端代码编辑器...
  11. 微信公众号发红包功能,现金红包、裂变红包接口
  12. 电脑文件被删除了,找回文件数据的方法有哪些?
  13. 征途单机版场景服务器端口被占用,《征途单机版》构架攻略
  14. 蓝桥杯:座次问题(枚举法 回溯) java
  15. mysql 按照中文拼音首字母排序
  16. Selenium+Python+Pycharm自动化环境搭建具体步骤
  17. Android谷歌推送
  18. 如何免费安装并激活序列号iMazing软件
  19. 两个或多个有序数组合并为一个有序数组
  20. CentOS安装星际译王

热门文章

  1. 成功解决socket.timeout: The read operation timed out问题
  2. 第十二节 SprnigBoot使用定时任务
  3. 企业是否需要crm系统?crm对企业有什么好处?
  4. Unity3D与AvosCloud网游开发实践 - 单线程U3D中的异步通讯处理
  5. MongoDB配置副本集(含Arbiter)
  6. php搞笑证件,怎么制作搞笑证件 网络搞笑证件制作的软件怎么用的
  7. 问题一:操作系统是什么?你知道哪些操作系统?怎么看自己的操作系统?电脑上怎么找到环境变量?问题二:Java开发工具还有哪些?问题三:软件公司有哪些?
  8. java派单系统平台源码完整版 带说明
  9. 使用Notepad++查看class文件
  10. Mac电脑怎么安装第三方非App Store来源的应用