郑重声明:以下sql语句均运行于 Oracle10g 大家一定要留意是oracle10g运行环境哦!原表信息如下create table TEST
(
ITEMNAME VARCHAR2(20),
ITEMVALUE VARCHAR2(20),
ID NUMBER,
LINE NUMBER
)insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('身高', '160cm', 1, 1, 'AAAM0uAAEAAAAFGAAA');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('姓名', '飞扬的学', 2, 1, 'AAAM0uAAEAAAAFGAAB');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('身高', '180cm', 3, 2, 'AAAM0uAAEAAAAFGAAC');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('姓名', '镜中的我', 4, 2, 'AAAM0uAAEAAAAFGAAD');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('视力', '2.0的', 5, 2, 'AAAM0uAAEAAAAFGAAE');我写的查询语句如下select
line line,
max(case itemname when '身高' then itemvalue else null end) 身高,
max(case itemname when '姓名' then itemvalue else null end) 姓名,
max(case itemname when '视力' then itemvalue else null end) 视力
from test
group by line;
这是原表的数据"ITEMNAME" "ITEMVALUE" "ID" "LINE"
"身高" "160cm" 1 1
"姓名" "张三" 2 1
"身高" "180cm" 3 2
"姓名" "宝林" 4 2
"视力" "2.0的" 5 2这是查询结果"LINE" "身高" "姓名" "视力"
1 "160cm" "张三" ""
2 "180cm" "宝林" "2.0的"大家注意!
核心问题:
我写的sql语句,查询的结果是固定列的 只有(身高,姓名,视力) 三列
问题是原表中 ITEMNAME列的值 不只是 (身高,姓名,视力) 三个值请各位高手 献出良策,感激不尽!
(
ITEMNAME VARCHAR2(20),
ITEMVALUE VARCHAR2(20),
ID NUMBER,
LINE NUMBER
)insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('身高', '160cm', 1, 1, 'AAAM0uAAEAAAAFGAAA');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('姓名', '飞扬的学', 2, 1, 'AAAM0uAAEAAAAFGAAB');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('身高', '180cm', 3, 2, 'AAAM0uAAEAAAAFGAAC');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('姓名', '镜中的我', 4, 2, 'AAAM0uAAEAAAAFGAAD');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('视力', '2.0的', 5, 2, 'AAAM0uAAEAAAAFGAAE');我写的查询语句如下select
line line,
max(case itemname when '身高' then itemvalue else null end) 身高,
max(case itemname when '姓名' then itemvalue else null end) 姓名,
max(case itemname when '视力' then itemvalue else null end) 视力
from test
group by line;
这是原表的数据"ITEMNAME" "ITEMVALUE" "ID" "LINE"
"身高" "160cm" 1 1
"姓名" "张三" 2 1
"身高" "180cm" 3 2
"姓名" "宝林" 4 2
"视力" "2.0的" 5 2这是查询结果"LINE" "身高" "姓名" "视力"
1 "160cm" "张三" ""
2 "180cm" "宝林" "2.0的"大家注意!
核心问题:
我写的sql语句,查询的结果是固定列的 只有(身高,姓名,视力) 三列
问题是原表中 ITEMNAME列的值 不只是 (身高,姓名,视力) 三个值请各位高手 献出良策,感激不尽!
CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
sqlstr VARCHAR2(4000) := '';
BEGIN
FOR cc IN (SELECT distinct itemname FROM test) LOOP
sqlstr := sqlstr || 'sum(decode(itemname,''' || cc.itemname ||''',itemvalue)) as "'
|| cc.itemname || '",';
END LOOP;
sqlstr := 'select line,' || rtrim(sqlstr,',') || ' from test group by line';
OPEN o FOR sqlstr;
END row2col;
union sex
004 2
002 2
002 2
003 1
002 1 现在我想显示这样的结果
1 2
002 1 2
003 1 0
004 0 1
也就是说按union sex两个字段count人数,得到二维表
--创建过程
create or replace procedure proc
as
sqlstr varchar2(2000):='create or replace view v_tmp as select "UNION"';
begin
for cur1 in (select distinct sex from tab1)
loop
sqlstr:=sqlstr||'
,count(decode(sex,'||cur1.sex||',1))"'||cur1.sex||'"';
end loop;
sqlstr:=sqlstr||' from tab1 group by "UNION"';
execute immediate sqlstr;
end;
--调用
begin
proc;
end;
--查看结果
select * from v_tmp
decode 我理解不深,能具体说一下他的功能,或者提供有效的资料
还有 有没有简化的方法
SqlServer 有PIVOT 和 UNPIVOT
不知道 oracle 有没有类似功能的关键字