在Oracle中“转置”一个表

时间:2016-03-12 00:59:44

标签: sql oracle oracle11g pivot

我在弄清楚如何重新安排桌子时遇到了很多麻烦。我有一个大表,看起来像这样:

+--------+-----------+
|  NAME  | ACCOUNT # |
+--------+-----------+
| Nike   |        87 |
| Nike   |        12 |
| Adidas |        80 |
| Adidas |        21 |
+--------+-----------+

我想重新安排它看起来像这样:

+------+--------+
| Nike | Adidas |
+------+--------+
|   87 |     80 |
|   12 |     21 |
+------+--------+

但我似乎无法弄清楚如何。我尝试使用PIVOT,但这只适用于聚合函数。我也试过使用FOR LOOP,但是不能让它正常工作。

2 个答案:

答案 0 :(得分:0)

您可以通过多种方式执行此操作,但所有方法都是通过枚举行来实现的。以下是使用条件聚合的示例:

select max(case when name = 'Nike' then account end) as Nike,
       max(case when name = 'Adidas' then account end) as Adidas
from (select t.*,
             row_number() over (partition by name order by account desc) as seqnum
      from t
     ) t
group by seqnum;

答案 1 :(得分:0)

再次考虑一个数据透视解决方案,但首先添加一个用于滚动Name组计数的rownumber。下面假设自动编号ID字段:

SELECT * FROM
(
  SELECT Name, "Account #", 
         (ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID)) GrpRowNum
         /* ALT: (SELECT Count(*) FROM Table1 sub 
          *       WHERE sub.Name = Table1.Name AND sub.ID <= Table1.ID) GrpRowNum */             
  FROM Table1
)
PIVOT
(
  SUM("Account #")
  FOR Name IN ('Nike', 'Adidas')
)
ORDER BY RowNum;

但是,对于大约200个项目,如果没有各种变通方法(包括IN输出或PL / SQL存储过程),则无法轻松呈现Pivot的PIVOT XML子句。类似地,您可以使用通用编码(Java,PHP,Python,R)在向量/数组中检索SELECT DISTINCT Name FROM Table1结果集,使用引号和逗号分隔符连接元素值(折叠或插入数组),并删除整个列表在IN条款中。