将行更改为列

时间:2012-11-05 12:00:43

标签: c# oracle oracle10g pivot dynamic-sql

我目前从我的查询中获取此输出: -

Count(Total)| Type1
-----------------
 24            T1

  22           T2

但我希望输出如下: -

 T1   T2
----------
 24   22

请注意,Type1列可以包含任何值,如T1,T2,T3,因此我无法修复查询中的值。我正在使用Oracle 10g,我该怎么办?

1 个答案:

答案 0 :(得分:1)

Oracle 10g没有PIVOT功能,因此您可以使用CASE的聚合:

select 
  sum(case when type1 = 'T1' then total end) T1,
  sum(case when type1 = 'T2' then total end) T2
from <yourquery goes here>

请参阅SQL Fiddle with Demo

或者您可以将此直接实现到与此类似的查询中,使用SUM()聚合将计算与type1语句中的CASE值匹配的每个匹配项:

select 
  sum(case when type1 = 'T1' then 1 else 0 end) T1,
  sum(case when type1 = 'T2' then 1 else 0 end) T2
from yourtable

如果您有一个未知数量的值要转换为列,那么您将需要使用类似于此的过程:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select ';

    begin
        for x in (select distinct type1 from yourtable order by 1)
        loop
            sql_query := sql_query ||
              ' , sum(case when type1 = '''||x.type1||''' then 1 else 0 end) as '||x.type1;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from yourtable';

        open p_cursor for sql_query;
    end;
/

然后执行它:

variable x refcursor
exec dynamic_pivot(:x)
print x