数据库的行列转换问题

问题一:

select * from v_temp
上面的视图结果如下:
user_name role_name
-------------------------
系统管理员 管理员
feng 管理员
feng 一般用户
test 一般用户
想把结果变成这样:
user_name role_name
---------------------------
系统管理员 管理员
feng 管理员,一般用户
test 一般用户

解答:

create table a_test(name varchar(20),role2 varchar(20))
insert into a_test values('李','管理員')
insert into a_test values('張','管理員')
insert into a_test values('張','一般用戶')
insert into a_test values('常','一般用戶')
create function join_str(@content varchar(100))
returns varchar(2000)
as
begin
declare @str varchar(2000)
set @str=''
select @str=@str+','+rtrim(role2) from a_test where [name]=@content
select @str=right(@str,len(@str)-1)
return @str
end
go
--调用:
select [name],dbo.join_str([name]) role2 from a_test group by [name]
--select distinct name,dbo.uf_test(name) from a_test

问题二:

一行变多列

SQL> select * from a3;
ID ID1 ID2
---------- ---------- ----------
1 2 3
SQL> select decode(column_name,column_name,column_name) name,
2 decode(column_name,'ID',ID,'ID1',ID1,'ID2',ID2) value
3 from user_tab_columns u,A3 tITPUB个人空间 CC HHS
4 where u.table_name='A3';

NAME VALUE
------------------------------ ----------
ID 1
ID1 2
ID3 3
------------------------------ ----------

问题三:

关于plsql的行列转换问题,
1 2 3 4
1 2 5 6
1 2 7 8

转换为
1 2 3 4 5 6 7 8
如果得到的結果是1行且是一列的話
SQL> with a as (select 1 id1,2 id2,3 id3,4 id4 from dual
2 union
3 select 1 id1,2 id2,5 id3,6 id4 from dual
4 union
5 select 1 id1,2 id2,7 id3,8 id4 from dual
6 )
7 select id1||','||id2||','||wmsys.wm_concat(id5) id6 from
8 (select id1,id2,id3||','||id4 id5 from a)
9 group by id1,id2
10 ;

ID6
--------------------------------------------------------------------------
1,2,3,4,5,6,7,8
如果是轉換成一行多列的話,就是這樣寫
SQL> with a as (select 1 id1,2 id2,3 id3,4 id4 from dual
2 union
3 select 1 id1,2 id2,5 id3,6 id4 from dual
4 union
5 select 1 id1,2 id2,7 id3,8 id4 from dual
6 )
7
7 select id1,id2,max(decode(rn,1,id3,null)) id3,
8 max(decode(rn,1,id4,null)) id4,
9 max(decode(rn,2,id3,null)) id5,
10 max(decode(rn,2,id4,null)) id6,
11 max(decode(rn,3,id3,null)) id7,
12 max(decode(rn,3,id4,null)) id8 from
13 (select id1,id2,id3,id4,row_number()over(partition by id1,id2 order by id1,id2,id3) rn from a)
14 group by id1,id2
15 order by id1,id2
16 /

ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8
---------- ---------- ---------- ---------- ---------- ---------- ----------
1 2 3 4 5 6 7 8

第二個行列轉換的例子
如下表:
ID 名称 类型 数量
1 0001 A 3
2 0001 A 1
3 0001 B 2
4 0002 A 4
5 0002 B 6
6 0002 B 3
查询的结果,我想要的是这种形式
名称 类型A 数量 类型B 数量
0001 A 4 B 2
0002 A 4 B 9

方法一
SQL> WITH A AS (SELECT 1 ID,'0001' NAME,'A' TYPE,3 QTY FROM DUAL
2 UNION
3 SELECT 2 ID,'0001' NAME,'A' TYPE,1 QTY FROM DUAL
4 UNION
5 SELECT 3 ID,'0001' NAME,'B' TYPE,2 QTY FROM DUAL
6 UNION
7 SELECT 4 ID,'0002' NAME,'A' TYPE,4 QTY FROM DUAL
8 UNION
9 SELECT 5 ID,'0002' NAME,'B' TYPE,6 QTY FROM DUAL
10 UNION
11 SELECT 6 ID,'0002' NAME,'B' TYPE,3 QTY FROM DUAL
12 )
13 SELECT NAME,'A',SUM(DECODE(TYPE,'A',QTY,0)) QTYA,'B',SUM(DECODE(TYPE,'B',QTY,0)) QTYB
14 FROM A
15 GROUP BY NAME
SQL> /
NAME 'A' QTYA 'B' QTYB
---- --- ---------- --- ----------
0001 A 4 B 2
0002 A 4 B 9
方法二
SQL> WITH A AS (SELECT 1 ID,'0001' NAME,'A' TYPE,3 QTY FROM DUAL
2 UNION
3 SELECT 2 ID,'0001' NAME,'A' TYPE,1 QTY FROM DUAL
4 UNION
5 SELECT 3 ID,'0001' NAME,'B' TYPE,2 QTY FROM DUAL
6 UNION
7 SELECT 4 ID,'0002' NAME,'A' TYPE,4 QTY FROM DUAL
8 UNION
9 SELECT 5 ID,'0002' NAME,'B' TYPE,6 QTY FROM DUAL
10 UNION
11 SELECT 6 ID,'0002' NAME,'B' TYPE,3 QTY FROM DUAL
12 )
13 SELECT NAME,MAX(DECODE(RN,1,TYPE,NULL)) TYPEA,
14 MAX(DECODE(RN,1,QTY,NULL)) QTYA,
15 MAX(DECODE(RN,2,TYPE,NULL)) TYPEB,
16 MAX(DECODE(RN,2,QTY,NULL)) QTYB
17 FROM (SELECT NAME,TYPE,QTY,ROW_NUMBER()OVER(PARTITION BY NAME ORDER BY NAME) RN FROM (select NAME,TYPE,SUM(QTY) QTY from A
18 GROUP BY NAME,TYPE
19 ORDER BY NAME))
20 GROUP BY NAME
21 /
NAME TYPEA QTYA TYPEB QTYB
---- ----- ---------- ----- ----------
0001 A 4 B 2
0002 A 4 B 9

你可能感兴趣的:(行列转换)