sql - 以 Oracle 10g 为中心

标签 sql oracle oracle10g pivot

我正在使用 oracle 10g。
我有一个临时表 TEMP。

TEMP 具有以下结构:-

USER COUNT TYPE
---- ----- ----
   1    10   T1
   2    21   T2
   3    45   T1
   1     7   T1
   2     1   T3

我需要一个查询来显示所有类型都有列名,类型可以有任何值,如 T1, T2,..Tn 并且结果将是这样的:-
USER T1 T2 T3
---- -- -- --
   1 17  0  0
   2  0 21  1
   3 45  0  0

User 列将显示所有用户,T1, T2 列将显示类型的总数。

最佳答案

在 Oracle 10g 中,没有 PIVOT 函数,但您可以使用带有 CASE 的聚合来复制它:

select usr,
  sum(case when tp ='T1' then cnt else 0 end) T1,
  sum(case when tp ='T2' then cnt else 0 end) T2,
  sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr;

SQL Fiddle with Demo

如果您有 Oracle 11g+,那么您可以使用 PIVOT 函数:
select *
from temp
pivot
(
  sum(cnt)
  for tp in ('T1', 'T2', 'T3')
) piv

SQL Fiddle with Demo

如果要转换的值数量未知,则可以创建一个过程来生成此动态版本:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select usr ';

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

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from temp group by usr';

        open p_cursor for sql_query;
    end;
/

然后执行代码:
variable x refcursor
exec dynamic_pivot(:x)
print x

所有版本的结果都是一样的:
| USR | T1 | T2 | T3 |
----------------------
|   1 | 17 |  0 |  0 |
|   2 |  0 | 21 |  1 |
|   3 | 45 |  0 |  0 |

编辑:根据你的评论,如果你想要一个 Total 字段,最简单的方法是将查询放在另一个类似于这个的 SELECT 中:
select usr,
  T1 + T2 + T3 as Total,
  T1,
  T2,
  T3
from
(
  select usr,
    sum(case when tp ='T1' then cnt else 0 end) T1,
    sum(case when tp ='T2' then cnt else 0 end) T2,
    sum(case when tp ='T3' then cnt else 0 end) T3
  from temp
  group by usr
) src;

SQL Fiddle with Demo

关于sql - 以 Oracle 10g 为中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13410464/

相关文章:

mysql - SQL查询: Current lowest price of products

java - Oracle Char 类型和 Hibernate

sql - Oracle 中的模型子句

Java 的准备语句与 Oracle Merge

sql - ORACLE SQL 如何使用自定义函数iside insert cte

Oracle 计算涉及另一个计算的结果

oracle - 如何返回新插入的记录列值

sql - 查询从具有 2 个 ID 列的表中获取名称

sql - 检查数据库中是否存在记录时出现 Linq To Entity 错误

sql - 从 PostgreSQL 表中查找具有最新日期的条目