日期:2014-05-17  浏览次数:20874 次

这个SQL列转行怎么写?
比如一个表有下面字段
A B C
1 5 6 
4 6 5
3 7 5
。。。。。

后面还有很多数据
我要查询结果B字段横着显示
 567。。。。

估计直接SQL语句写不出来?
用PLSQL写呢?怎么写
DBMS_OUTPUT.PUTLINE都是竖着显示的,
我要横着显示。。
位大哥不要说用where,case..when,decode这些哈,这个如果有一万条数据,那我要写一万个条件?还要去看这一万个字段里面的内容?

------解决方案--------------------
用游标写的,您看对不对

SQL code

create table a (B number(10));

begin

for i in 1..50 loop
  insert into a values(i);
end loop;
end;
/

declare
ss varchar2(32767);
CURSOR cur is
select B from a;
begin
for i in cur loop
  ss:= ss||i.B||' ';
end loop;
dbms_output.put_line(ss);
end;
/

------解决方案--------------------
這樣?
SQL code
WITH t AS(
SELECT 1 A,5 B,6 C FROM DUAL
UNION ALL
SELECT 4,6,5 FROM DUAL
UNION ALL 
SELECT 3,7,5 FROM DUAL
)
SELECT REPLACE(WM_CONCAT(B),',','')AS B FROM T;

output:
B
567

------解决方案--------------------
只要B字段的數據橫著顯示而已?還是必須生成多個字段?
如果是後者要複雜些的存儲,如果是前者的需求,直接wm_concat?
SQL code
WITH t AS(
SELECT 1 A,5 B,6 C FROM DUAL
UNION ALL
SELECT 4,6,5 FROM DUAL
UNION ALL 
SELECT 3,7,5 FROM DUAL
)
SELECT REPLACE(WM_CONCAT(B),',','')AS B FROM T;

output:
B
567

------解决方案--------------------
prompt
prompt Creating type STRCAT_TYPE
prompt =========================
prompt
create or replace type strcat_type as object
(
cat_string varchar2(4000),
--对象初始化
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)
return number,
--聚合函数的迭代方法(这是最重要的方法)
member function ODCIAggregateIterate(self In Out strcat_type,
value in varchar2) return number,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
member function ODCIAggregateMerge(self In Out strcat_type,
ctx2 In Out strcat_type) return number,
--终止聚集函数的处理,返回聚集函数处理的结果
member function ODCIAggregateTerminate(self In Out strcat_type,
returnValue Out varchar2,
flags in number)
return number
)
/

prompt
prompt Creating type body STRCAT_TYPE
prompt ==============================
prompt
create or replace type body strcat_type is
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
is
begin
cs_ctx := strcat_type( null );
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN varchar2 )
return number
is
begin
/*字符串已','分割 */
self.cat_string := self.cat_string || ','|| value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN Out strcat_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
/*去除空(is null)*/
returnValue := ltrim(rtrim(self.cat_string,','),',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN Out strcat_type)
return number
is
begin
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
return ODCIConst.Success;
end;
end;
/

prompt
prompt Creating function FUNC_STRCAT
prompt =============================
prompt
CREATE OR REPLACE FUNCTION func_strcat(input varchar2) RETURN varchar2 -- 返回值
PARALLEL_ENABLE
AGGREGATE USING strcat_type;