比如一个表有下面字段
A    B    C
1    5    6 
4    6    5
3    7    5
。。后面还有很多数据
我要查询结果B字段横着显示
 567。估计直接SQL语句写不出来?
用PLSQL写呢?怎么写
DBMS_OUTPUT.PUTLINE都是竖着显示的,
我要横着显示。。
位大哥不要说用where,case..when,decode这些哈,这个如果有一万条数据,那我要写一万个条件?还要去看这一万个字段里面的内容?

解决方案 »

  1.   

    用游标写的,您看对不对
    create table a (B number(10));beginfor 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;
    /
      

  2.   

    搜索 oracle 动态行列转换 很多例子 比较简单
      

  3.   

    這樣?
    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
      

  4.   

    只要B字段的數據橫著顯示而已?還是必須生成多個字段?
    如果是後者要複雜些的存儲,如果是前者的需求,直接wm_concat?
    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
      

  5.   

    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;
    /
               SELECT FUNC_STRCAT(g.emition_code) INTO v_gcode_list
                 FROM b_gas_emition g
                WHERE g.pollution_code = v_pcode_table_list(v_i);v_gcode_list 会被赋值成一串 emition_code,用逗号隔开的。我常用这个函数
      

  6.   

    把b中的东西distinct出来放到一个游标
    遍历游标弄成动态sql
      

  7.   

    select replace(wmsys.wm_concat(b),',','') from tableName
      

  8.   

    select replace(wmsys.wm_concat(b),',','') from tableName;