现有表结构如下
hh dbbm
123 01Q1
45 01A1
45 01C1
908 01Q1
676 01A1
676 01C1
在查询后要得到这样的结果
hh dbbm1 dbbm2
123 01Q1
45 01A1 01C1
908 01Q1
676 01A1 01C1
问题比较急,请知道的兄台不吝赐教
hh dbbm
123 01Q1
45 01A1
45 01C1
908 01Q1
676 01A1
676 01C1
在查询后要得到这样的结果
hh dbbm1 dbbm2
123 01Q1
45 01A1 01C1
908 01Q1
676 01A1 01C1
问题比较急,请知道的兄台不吝赐教
http://community.csdn.net/Expert/topic/3222/3222974.xml?temp=.5841181col1 col2
-----------------
0001 Tom
0001 Jack
0001 Mike
0002 Kate
0002 Rose
0002 Fene如何用一条SQL语句得到如下结果:
col1 col2
-----------------
0001 Tom,Jack,Mike
0002 Kate,Rose,Fene创建自定义函数:
create or replace function f_ename(jobno in varchar2)
return varchar2 is
str_return varchar2(200);
cursor c_ename(v_jobno varchar2) is select ename from emp where job=v_jobno;
begin
for str_temp in c_ename(jobno) loop
str_return:=str_return||str_temp.ename;
end loop;
return str_return;
end;
/ 调用:
select job,f_ename(job) from (select distinct job from emp); oracle 如何做行列动态的交叉表
http://community.csdn.net/Expert/topic/3093/3093861.xml?temp=.5882379
/*
Create table test (name varchar2(10),km varchar2(10),cj number)
go
insert into test values('张三','语文',80);
insert into test values('张三','数学',86);
insert into test values('张三','英语',75);
insert into test values('李四','语文',78);
insert into test values('李四','数学',85);
insert into test values('李四','英语',78);
select * from test;select name,
sum(decode(km,'语文',cj,0)) as 语文,
sum(decode(km,'数学',cj,0)) as 数学,
sum(decode(km,'英语',cj,0)) as 英语
from test
group by name;
*/CREATE OR REPLACE PACKAGE Pack_Test
AS
TYPE QUERY_CURSOR IS REF CURSOR;
PROCEDURE My_cur_out(
result out QUERY_CURSOR);
END Pack_Test;
CREATE OR REPLACE PACKAGE BODY Pack_Test
AS
PROCEDURE My_cur_out(
result out QUERY_CURSOR
)
AS
BEGIN
DECLARE
v_result varchar2(4000);
v_table varchar2(255):='TEST';--表名
v_col1 varchar2(255):='NAME'; --表的第一个列
v_col2 varchar2(255):='KM'; --表的第二个列
v_col3 varchar2(255):='CJ'; --表的第三个列
v_value varchar2(255);
v_file utl_file.file_type;
TYPE cur_type IS REF CURSOR;
cur_row cur_type;
BEGIN
v_result := 'SELECT '||v_col1;
OPEN cur_row FOR 'SELECT DISTINCT '||v_col2||' FROM '||v_table;
LOOP
FETCH cur_row INTO v_value;
EXIT WHEN cur_row%NOTFOUND;
v_result := v_result||',sum(decode('||v_col2||','''||v_value||''','||v_col3||','''')) as '||v_value;
END LOOP;
CLOSE cur_row;
v_result := v_result||' from '||v_table||' group by '||v_col1;
OPEN result FOR v_result;
END;
END;
END Pack_Test;
答案跟你说的第一个例子有点相似,但是不是在一列显示,而是要分2列分别显示01A1,01C1
,如果是01Q1的话第二列就显示为空
GO
INSERT INTO ll_TEST1 VALUES('张三','语文',80);
INSERT INTO ll_TEST1 VALUES('张三','数学',86);
INSERT INTO ll_TEST1 VALUES('张三','英语',75);
INSERT INTO ll_TEST1 VALUES('李四','语文',78);
INSERT INTO ll_TEST1 VALUES('李四','数学',85);
INSERT INTO ll_TEST1 VALUES('李四','英语',78);
SELECT * FROM ll_TEST1;SELECT NAME,
SUM(DECODE(km,'语文',cj,0)) AS 语文,
SUM(DECODE(km,'数学',cj,0)) AS 数学,
SUM(DECODE(km,'英语',cj,0)) AS 英语,
SUM(DECODE(km,'英语1',cj,NULL)) AS 英语1
FROM ll_TEST1
GROUP BY NAME;--改改不就是你要的结果么
如果列是动态的
你参考一下那个包
45 01C1
如果45 有01Q1 怎么办啊
from t
group by hh
问题已经解决,十分感谢,20分送上