Sql Oracle中表的“转置”
我很难弄清楚如何重新安排一张桌子。我有一张大桌子,看起来像这样:Sql Oracle中表的“转置”,sql,oracle,oracle11g,pivot,Sql,Oracle,Oracle11g,Pivot,我很难弄清楚如何重新安排一张桌子。我有一张大桌子,看起来像这样: +--------+-----------+ | NAME | ACCOUNT # | +--------+-----------+ | Nike | 87 | | Nike | 12 | | Adidas | 80 | | Adidas | 21 | +--------+-----------+ +------+--------+ | Nike | Adida
+--------+-----------+
| NAME | ACCOUNT # |
+--------+-----------+
| Nike | 87 |
| Nike | 12 |
| Adidas | 80 |
| Adidas | 21 |
+--------+-----------+
+------+--------+
| Nike | Adidas |
+------+--------+
| 87 | 80 |
| 12 | 21 |
+------+--------+
我想把它重新排列成这样:
+--------+-----------+
| NAME | ACCOUNT # |
+--------+-----------+
| Nike | 87 |
| Nike | 12 |
| Adidas | 80 |
| Adidas | 21 |
+--------+-----------+
+------+--------+
| Nike | Adidas |
+------+--------+
| 87 | 80 |
| 12 | 21 |
+------+--------+
但我似乎不知道怎么做。我尝试使用PIVOT,但这只适用于聚合函数。我也尝试过使用FOR循环,但无法使其正常工作。您可以通过几种方法来实现这一点,但都是通过枚举行来实现的。以下是使用条件聚合的示例:
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;
再次考虑pivot解决方案,但首先为滚动名称组计数添加行号。下面假定一个自动编号ID字段:
但是,对于大约200个项目,如果没有各种解决方法(包括Pivot XML输出或使用PL/SQL的存储过程),则无法轻松呈现Pivot的IN子句。类似地,您可以使用通用编码Java、PHP、Python、R从vector/array中的Table1 resultset中检索SELECT DISTINCT Name,使用引号和逗号分隔符连接元素值折叠或内爆数组,并在in子句中删除整个列表。告诉我们您尝试了什么,以及为什么它不能满足您的需要。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另请参见向我们展示一些SQL。如果您不需要聚合使用最小或最大函数谢谢您的答案,但不幸的是,这对我不起作用-我应该提到,但大约有200个名称,因此我无法为每个名称编写条件语句。@TinaBelcher。你可以。您可能会发现电子表格有助于生成代码。