表结构及数据
row\columns pk column1 column2
row1 100 A apple
row2 101 A bag
row3 102 A cat
row4 103 B dog
row5 104 B egg
想转化成
A apple,bag,cat
B dog,egg这样的形式,应该如何写sql啊
row\columns pk column1 column2
row1 100 A apple
row2 101 A bag
row3 102 A cat
row4 103 B dog
row5 104 B egg
想转化成
A apple,bag,cat
B dog,egg这样的形式,应该如何写sql啊
解决方案 »
- sql查询m时间内,出现频度n以上的记录。例如:表中记录日期与天气,查询3天内出现2天雨以上的日期起期。
- 有没有办法让下面两个SQL排序结果的第一条是一样的
- oracle中instr函数问题
- oracle 下面的 REDO01.LOG 文件被清理垃圾时给删除了,现在ORACLE数据库启动不了.怎么办啊.
- 创建自动增长ID无效 帮忙看一下
- oracle10g release1 版本的数据库,A 用户要怎么才能访问B用户的表呢?
- proc基础问题
- oracle 中用like检索如何取出全部带有%的数据。(再线等)
- 如何Create表存储考勤数据?
- 我是一个新手,请问哪位高手能给我指点一下如何结合学习Delphi和Oracle的技巧和方法
- 请问一个rownum异常的问题
- 本机没有安装Oracle数据库,使用C#中的OracleClient连接远程Oracle数据库
select '100' pk , 'A ' column1 ,'apple' column2 from dual union all
select '101' pk , 'A ' column1 ,'bag' column2 from dual union all
select '102' pk , 'A ' column1 ,'cat' column2 from dual union all
select '103' pk , 'B ' column1 ,'dog' column2 from dual union all
select '104' pk , 'B ' column1 ,'egg' column2 from dual
) select column1, replace(wm_concat(to_char(column2)),',',',') as column2
from dm_gw
group by column1;
(select 'row1' a,100 b,'a' c,'apple' d from dual
union all
select 'row2',101,'a','bag' from dual
union all
select 'row3',102,'a','cat' from dual
union all
select 'row4',103,'b','dog' from dual
union all
select 'row5',104,'b','egg' from dual
)
select c, replace(wm_concat(to_char(d)),'',',') ds
from a
group by c--结果
a apple,bag,cat
b dog,egg
10g或以上的,可以用楼上的wm_concat9i的话 decode函数拼接或存储过程处理
交叉表
主键:id+lx
select * from tab_1;显示结果如下:
id lx sj
---------------------
1 1类 03-01-01
1 2类 03-01-02
2 1类 03-02-01
2 2类 03-02-02
2 3类 03-02-03
3 2类 03-03-02 select id,max(decode(lx,'1类',sj)) 1类,
max(decode(lx,'2类',sj)) 2类,
max(decode(lx,'3类',sj)) 3类
from tab_1
group by id; id 1类 2类 3类
-------------------------------------------
1 03-01-01 03-01-02
2 03-02-01 03-02-02 03-02-03
3 03-03-02
..........
标题:合并相同列的数据
作者:爱新觉罗.毓华
时间:2008-05-05
地点:广东深圳
*//*情况说明
NAME USERID
张三 KB001
张三 KB003
李四 KB001
李四 KB002
李四 KB003用SQL实现表示如下:
NAME USERID
张三 KB001,KB003
李四 KB001,KB002,KB003
*/create table tb(NAME varchar2(10) , USERID varchar2(10))
insert into tb values('张三' , 'KB001');
insert into tb values('张三' , 'KB003');
insert into tb values('李四' , 'KB001');
insert into tb values('李四' , 'KB002');
insert into tb values('李四' , 'KB003');--1
select name,rtrim(
max(decode(USERID , 'KB001' , USERID || ',' , '')) ||
max(decode(USERID , 'KB002' , USERID || ',' , '')) ||
max(decode(USERID , 'KB003' , USERID || ',' , '')),',') userid
from tb
group by name--2
SELECT NAME, ltrim(MAX(sys_connect_by_path(userid , ',')) , ',') userid
FROM (SELECT NAME , userid , row_number() over(PARTITION BY NAME ORDER BY userid) rn , rownum prn FROM tb)
START WITH rn = 1
CONNECT BY prn - 1 = PRIOR prn AND NAME = PRIOR NAME
GROUP BY NAME
ORDER BY NAME;drop table tb/*
NAME USERID
---------- ---------------------------------
李四 KB001,KB002,KB003
张三 KB001,KB003
2 rows selected
*/10g及以上可用WMSYS.WM_CONCAT.
select c, wm_concat(to_char(d)) ds
from a
group by c
select cloumn1, wm_concat(cloumn2)
from table
group by cloumn1
但是wm_concat函数是最方便的。
SELECT t.col1 col1 , MAX(substr(sys_connect_by_path(t.col2, ','), 2)) str
FROM (SELECT col1, col2, row_number() over(PARTITION BY col1 ORDER BY col2) rn
FROM t_row_str) t
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND col1 = PRIOR col1
GROUP BY t.col1 ;
一,使用PIVOT 实现数据表的列转行
语法:
SELECT <未透视的列>, [第一个透视列] AS <列别名>, [第二个透视列] AS <列别名>, ... [最后一个透视列] AS <列别名> FROM ( <SELECT查询> ) AS <源表> PIVOT ( <聚合函数>(<列>) FOR [<需要转换为行的列>] IN ( [第一个透视列], [第二个透视列], ... [最后一个透视列] ) ) AS <数据透视表> <可选的ORDER BY子句>; 以上的PIVOT子句内的第1…n个透视列的值均为需要转换为行的列的常量值,需要用[]括起,支持GUID,字符串及各种数字!二,使用UNPIVOT 实现的功能其实与PIVOT恰恰相反
语法:
SELECT <未逆透视的列>, [合并后的列] AS <列别名>, [行值的列名] AS <列别名> FROM ( ) AS <源表> UNPIVOT ( <行值的列名> FOR <将原来多个列合并到单个列的列名> IN ( [第一个合并列], [第二个合并列], ... [最后一个合并列] ) ) AS <数据逆透视表> <可选的ORDER BY子句>;关于PIVOT和UNPIVOT命令的使用,如果想了解更多SQL的知识可以去看看这里的文章:http://database.51cto.com/sqlserver/,绝对不会让您失望的哦.