2

我有以下表格的表格

chain   |branch
________|________|
    a   |UK
    a   |US
    b   |ISRAEL
    b   |UK
    b   |FRANCE
    b   |BELGIUM
    c   |NIGERIA

我想按以下格式创建一个新表

chain   |branch_1|branch_2|branch_3|branch_4
________|________|________|________|________|
    a   |  UK    |  US    |--------|--------|
    b   |  ISRAEL|  UK    | FRANCE |BELGIUM |
    c   | NIGERIA|--------|--------|--------|

为了进一步澄清,假设您可以按(链)进行分组,其中聚合函数是标识,以便

group_1->(element1,element2,element3,..,elementM)
group_2->(element1,element2,element3,..,elementN)
...
group_X->(element1,element2,element3,..,elementZ)

因此将创建一个包含 R+K 列的新表,其中 R 是我们分组的列数(在我们的例子中是列“链”,所以 R=1),K 是组的最大计数(在我们的例子中是四个,对应于链'b')

我确信这一定是一个常见问题,所以如果之前回答过这个问题,我深表歉意,但我找不到任何东西。

编辑:这不是数据透视表 在这种情况下,数据透视表将是

chain   |UK      |US      |ISRAEL  |FRANCE  |BELGIUM |NIGERIA |
________|________|________|________|________|________|________|
____a___|____1___|____1___|____0___|____0___|____0___|____0___|
____b___|____1___|____0___|____1___|____1___|____1___|____0___|
____c___|____0___|____0___|____0___|____0___|____0___|____1___|

谢谢!

4

1 回答 1

4

您可以使用条件聚合来做到这一点,并且row_number()

select chain,
       max(case when seqnum = 1 then branch end) as branch_01,
       max(case when seqnum = 2 then branch end) as branch_02,
       max(case when seqnum = 3 then branch end) as branch_03,
       max(case when seqnum = 4 then branch end) as branch_04
from (select t.*,
             row_number() over (partition by chain order by branch) as seqnum
      from table t
     ) t
group by chain;

注意:您的表没有指定行顺序的列。SQL 表表示无序集。没有这样的列,就没有一行在另一行之前或之后的概念。因此,此版本按分支名称排序。您可以通过更改order byfor 子句来按您喜欢的顺序排序row_number()

于 2015-08-18T15:30:21.417 回答