sql 按集合从组中创建列
sql create columns from group by collection
我有一个table,格式如下
chain |branch
________|________|
a |UK
a |US
b |ISRAEL
b |UK
b |FRANCE
b |BELGIUM
c |NIGERIA
我想按以下格式创建一个新的 table
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)
因此将创建一个新的 table
R+K 列,其中 R 是我们分组的列数(在我们的例子中是列 'chain',所以 R=1),K 是组的最大数量(在我们的例子中是四,对应链'b')
我相信这一定是一个常见问题,如果之前有人回答过,我深表歉意,但我找不到任何东西。
编辑:
这不是一个枢轴 TABLE
在这种情况下,枢轴 table 将是
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___|
谢谢!
您可以使用条件聚合和 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;
注意:您的 table 没有指定行顺序的列。 SQL table 表示 无序 集合。没有这样一列,就没有一行在另一行之前或之后的概念。因此,此版本按分支名称排序。您可以通过更改 row_number()
.
的 order by
子句来按您喜欢的方式进行排序
我有一个table,格式如下
chain |branch
________|________|
a |UK
a |US
b |ISRAEL
b |UK
b |FRANCE
b |BELGIUM
c |NIGERIA
我想按以下格式创建一个新的 table
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)
因此将创建一个新的 table R+K 列,其中 R 是我们分组的列数(在我们的例子中是列 'chain',所以 R=1),K 是组的最大数量(在我们的例子中是四,对应链'b')
我相信这一定是一个常见问题,如果之前有人回答过,我深表歉意,但我找不到任何东西。
编辑: 这不是一个枢轴 TABLE 在这种情况下,枢轴 table 将是
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___|
谢谢!
您可以使用条件聚合和 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;
注意:您的 table 没有指定行顺序的列。 SQL table 表示 无序 集合。没有这样一列,就没有一行在另一行之前或之后的概念。因此,此版本按分支名称排序。您可以通过更改 row_number()
.
order by
子句来按您喜欢的方式进行排序