行列转换

来源:互联网 发布:潍坊招聘网络销售 编辑:程序博客网 时间:2024/04/30 06:59

1. 行列转换--普通

假设有张学生成绩表(CJ)如下
[姓名]  [学科]  [成绩]
张三    语文    80
张三    数学    90
张三    物理    85
李四    语文    85
李四    数学    92
李四    物理    82
王五    数学    60

想变成    
[姓名] [语文] [数学] [物理]
张三   80     90     85
李四   85     92     82
王五   null   60     null

declare @sql varchar(4000)
set @sql = 'select 姓名'
select @sql = @sql + ',sum(case 学科 when ''' 学科 ''' then 成绩 end) as ' 学科
  from (select distinct 学科 from CJ) as a
set @sql = @sql ' from cj group by 姓名'
exec(@sql)


2. 行列转换--合并

有表A,
id pid
1   1
1   2
1   3
2   1
2   2
3   1
如何化成表B:
id pid
  1  1,2,3
  2  1,2
  3  1

创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str ',' cast(pid as varchar) from 表A where id=@id
set @str=right(@str,len(@str)-1)
return(@str)
end
go

--调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A

 

<2>、不定列行列转换
  如
  c1 c2
  --------------
  1 我
  1 是
  1 谁
  2 知
  2 道
  3 不
  ...
  转换为
  1 我是谁
  2 知道
  3 不
  这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
  CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
  RETURN VARCHAR2
  IS
  Col_c2 VARCHAR2(4000);
  BEGIN
  FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
  Col_c2 := Col_c2||cur.c2;
  END LOOP;
  Col_c2 := rtrim(Col_c2,1);
  RETURN Col_c2;
  END;
  /
  SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可
  --例子:
  create table okcai_1
  (
  user_id varchar2(10),
  user_number varchar2(10),
  user_num number(8)
  )
  user_id user_number user_num
  ---------------------
  1 123 2
  1 456 5
  1 789 6
  2 11 2
  2 22 3
  2 33 4
  2 44 5
  2 55 6
  2 66 7
  2 77 8
  3 1234 1
  3 5678 2
  方式一:
  create or replace function get_col(
   p_userId number,
   p_col number
  ) return varchar
  as
  v_tmp varchar2(255);
  begin
   select user_number||chr(9)||user_num into v_tmp
   from
   (select user_number,user_num,rownum row_id
   from okcai_1
   where user_id = p_userId) a
   where row_id = p_col;
   return ltrim(v_tmp);
   --return v_tmp;
  end;
  然后
  select distinct user_id,get_col(user_id,1),get_col(user_id,2),get_col(user_id,3) .... from okcai_1
  方式二:
  create or replace function get_col(
   p_userId number,
   p_col number
  ) return varchar
  as
  v_tmp varchar2(255);
  begin
   select user_number||chr(9)||user_num into v_tmp
   from
   (select user_number,user_num,rownum row_id
   from okcai_1
   where user_id = p_userId) a
   where row_id = p_col;
   return ltrim(v_tmp);
   --return v_tmp;
  end;
  select distinct user_id,get_col_new(user_id) from okcai_1;